【发布时间】:2011-05-27 16:53:43
【问题描述】:
我认为这是第一个失败的 strtok 调用。自从我写C以来已经有一段时间了,我很茫然。非常感谢。
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv) {
char *str = "one|two|three";
char *tok = strtok(str, "|");
while (tok != NULL) {
printf("%s\n", tok);
tok = strtok(NULL, "|");
}
return 0;
}
【问题讨论】:
-
下一次,不要不知所措:您可以使用任何调试器准确找出无效访问发生的位置。或者更好的是,使用 valgrind,它可以检测无效访问,即使它们不会使您的程序崩溃。
-
那么,valgrind 是 gdb 功能的超集吗?我正在考虑是否最好在 gdb 或 valgrind 中进行速成课程。
-
valgrind 和 gdb 是互补的。 valgrind 是非交互式的,但在内存访问方面比 gdb 更加挑剔。
-
对您的代码进行切向编辑:
strsep在功能上等同于strtok,但具有更好的调用约定。这是一个非标准的 BSD 主义,但除了 Windows 之外的每个人都有,可惜 C99 发明了strtok_r而不是捡起它。 -
strsep在存在多个连续分隔符的情况下具有明显不同的语义。