gpt4 book ai didi

C strtok() 将字符串拆分为标记,但保持旧数据不变

转载 作者:太空狗 更新时间:2023-10-29 15:09:57 25 4
gpt4 key购买 nike

我有以下代码:

#include <stdio.h>
#include <string.h>

int main (void) {
char str[] = "John|Doe|Melbourne|6270|AU";

char fname[32], lname[32], city[32], zip[32], country[32];
char *oldstr = str;

strcpy(fname, strtok(str, "|"));
strcpy(lname, strtok(NULL, "|"));
strcpy(city, strtok(NULL, "|"));
strcpy(zip, strtok(NULL, "|"));
strcpy(country, strtok(NULL, "|"));

printf("Firstname: %s\n", fname);
printf("Lastname: %s\n", lname);
printf("City: %s\n", city);
printf("Zip: %s\n", zip);
printf("Country: %s\n", country);
printf("STR: %s\n", str);
printf("OLDSTR: %s\n", oldstr);

return 0;
}

执行输出:

$ ./str
Firstname: John
Lastname: Doe
City: Melbourne
Zip: 6270
Country: AU
STR: John
OLDSTR: John

为什么我不能保留旧数据,也不能保留在 stroldstr 中,我做错了什么,我如何才能不更改或保留数据?

最佳答案

当你做 strtok(NULL, "|") strtok()找到 token 并放入 null就位(\0 替换标记 )并修改字符串。

str , 变成:

char str[] = John0Doe0Melbourne062700AU;

Str array in memory
+------------------------------------------------------------------------------------------------+
|'J'|'o'|'h'|'n'|0|'D'|'o'|'e'|0|'M'|'e'|'l'|'b'|'o'|'u'|'r'|'n'|'e'|0|'6'|'2'|'7'|'0'|0|'A'|'U'|0|
+------------------------------------------------------------------------------------------------+
^ replace | with \0 (ASCII value is 0)

认为图表很重要,因为 char '0'0是不同的(在字符串 6270 中,数字中的字符由 ' 括起来,其中 \0 0 是数字)

当您使用 %s 打印 str 时它首先打印字符 \0那是 John

要保持原始 str 不变,您应该先将 str 复制到某个 tempstr 变量中,然后使用它 tempstr strtok() 中的字符串:

char str[] = "John|Doe|Melbourne|6270|AU";
char* tempstr = calloc(strlen(str)+1, sizeof(char));
strcpy(tempstr, str);

现在使用这个 tempstr string 代替代码中的 str。

关于C strtok() 将字符串拆分为标记,但保持旧数据不变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17104953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com