分段故障与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内部的静态指针指向)在迭代之间被修改以返回令牌。