在以下代码中:
#include <stdio.h>
#include <string.h>
int main (int argc, const char * argv[]) {
char input[20];
fgets(input, sizeof(input), stdin);
char * pch;
pch = strtok(input, " ");
int i = 0;
int nums[3];
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok(NULL, " ");
//nums[i] = atoi(pch);
i++;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输入
1 2 3
Run Code Online (Sandbox Code Playgroud)
得到:
1
2
3
Run Code Online (Sandbox Code Playgroud)
当我取消注释注释行时,我得到:
1
2
3
Segmentation fault: 11
Run Code Online (Sandbox Code Playgroud)
为什么这一行导致seg错误?
最重要的是你需要atoi(pch) 在strtok再次呼叫之前运行:
printf ("%s\n",pch);
nums[i++] = atoi(pch);
pch = strtok(NULL, " ");
Run Code Online (Sandbox Code Playgroud)
否则最后一次调用atoi将空指针作为参数传递并atoi崩溃.
感兴趣的另一个细节是最后input可能包含换行符.这不会是一个问题atoi,但它会导致你的循环迭代4次并在结束后写nums.虽然它很可能不会导致程序崩溃,但这仍然是未定义的行为,您应该插入数组边界检查以防止它.