gpt4 book ai didi

c - strtok 改变指针的值

转载 作者:太空宇宙 更新时间:2023-11-04 01:48:27 24 4
gpt4 key购买 nike

我有以下代码:

char* pathTokens;
char* paths;
paths = getFilePaths();

//printf("%s", paths);

pathTokens = strtok(paths, "\n");

updateFile(pathTokens, argv[1]);

这些变量与 updateFile() 在同一个文件中:

static FILE* file;
static char content[1024];
static char* token;
static int numChanges = 0;

static char newContent[1024];

这里是 updateFile():

void updateFile(char pathTokens[], char searchWord[]) {
while(pathTokens != NULL) {
printf("Token: %s\n", pathTokens);
updateNewContent(pathTokens, searchWord);

pathTokens = strtok(NULL, "\n");
}
}

和 updateNewContent():

static void updateNewContent(char fileName[], char searchWord[]) {
if(searchWord == NULL) {
printf("Please enter a word\n");
return;
}
numChanges = 0;
file = fopen(fileName, "r");

if(file == NULL) {
printf("Error opening file\n");
return;
}


while(fgets(content, 1024, file) != NULL) {
token = strtok(content, " ");
}
fclose(file);
}

每当 token = strtok(c​​ontent, ""); 被调用时,pathTokens 的值就会改变。如果我将其注释掉,pathTokens 将保持其原始值。我不希望 pathTokens 改变,那么为什么 strtok 修改它?

最佳答案

您正在嵌套 strtok 调用,而 strtok 不能那样工作。嵌套用您必须使用 strtok_r 调用。

另外,调用strtok时,只有第一次source参数必须是used,对于所有后续调用,必须使用 NULL。当你调用 strtok再次使用非 NULL 参数,strtok “忘记”最后的状态和“重新启动”解析新内容。

当您在 updateNewContent 中执行操作时:

while(fgets(content, 1024, file) != NULL) {
token = strtok(content, " ");
}

strtok 将忘记 paths(第一个调用)。这个循环也是毫无意义,你读一行,你第一次拆分它,然后读下一行,再次拆分它,等等。你没有对 token 做任何事情。当。。。的时候循环结束 token 将存储最后一行的第一个单词。

然后函数返回,你做

pathTokens = strtok(NULL, "\n");

因为你用NULL调用它,它会继续解析内容由 content 指向,这似乎是一个全局变量。

whenever token = strtok(content, " "); is called, the value of pathTokens changes

当然可以,在 updateNewContent 返回后,您将一个新值赋给它。您还期待什么?

我真的不知道你想在这里做什么,对我来说这毫无意义。如果您需要使用之前由另一个人返回的 token 执行 strtokstrtok,那你就得用strtok_r

下面是一个如何嵌套 strtok 的例子:

char line[] = "a:b:c,d:e:f,x:y:z";

char *s1, *s2, *token1, *token2, *in1, *in2;

in1 = line;

while(token1 = strtok_r(in1, ",", &s1))
{
in1 = NULL; // for subsequent calls

in2 = token1;

printf("First block: %s\n", token1);

while(token2 = strtok_r(in2, ":", &s2))
{
in2 = NULL; // for subsequent calls

printf(" val: %s\n", token2);
}
}

输出:

First block: a:b:c
val: a
val: b
val: c
First block: d:e:f
val: d
val: e
val: f
First block: x:y:z
val: x
val: y
val: z

关于c - strtok 改变指针的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48614983/

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