分段故障与fgets() – C一致

我的程序中有这个代码:

char* tok = NULL; char move[100]; if (fgets(move, 100, stdin) != NULL) { /* then split into tokens using strtok */ tok = strtok(move, " "); while (tok != NULL) { printf("Element: %s\n", tok); tok = strtok(NULL, " "); } } 

我尝试在fgets之前和之后添加printf语句,并且之前的那个被打印,但后面的那个没有。 我不明白为什么这个fgets调用导致分段失败。

如果有人有任何想法,我会非常感激。

谢谢科里

strtok运行时函数的工作原理如下

第一次调用strtok时,您提供了一个要标记的字符串

 char s[] = "this is a string"; 

在上面的字符串空间似乎是单词之间的一个很好的分隔符,所以让我们使用:

 char* p = strtok(s, " "); 

现在发生的是搜索’s’直到找到空格字符,返回第一个标记(’this’)并且p指向该标记(字符串)

为了获得下一个标记并继续使用相同的字符串NULL作为第一个参数传递,因为strtok维护一个指向前一个传递字符串的静态指针:

 p = strtok(NULL," "); 

p现在指向’是’

等等,直到找不到更多的空格,然后最后一个字符串作为最后一个标记“字符串”返回。

更方便的是你可以像这样写它来打印出所有的标记:

 for (char *p = strtok(s," "); p != NULL; p = strtok(NULL, " ")) { puts(p); } 

编辑在这里:

如果要存储来自strtok的返回值,则需要将令牌复制到另一个缓冲区,例如strdup(p); 因为原始字符串(由strtok内部的静态指针指向)在迭代之间被修改以返回令牌。