我必须获取字符串中的第三个单词并想使用strtok。现在,第一个 printf 可以工作,但之后我遇到了段错误。所以 tokenizedString = strtok(NULL, "");
一定是导致问题的原因,对吧?
仅供引用:我正在查找字符串中的第三个单词,并且单词之间可以有尽可能多的空格。
#include <string.h>
#include <stdio.h>
char *tokenizeString(char *userCommand)
{
char *tokenizedString;
int counterForToken;
tokenizedString = strtok(userCommand, " ");
for(counterForToken = 0; counterForToken != 3; counterForToken++)
{
printf("%s\n", tokenizedString);
tokenizedString = strtok(NULL, " ");
if(tokenizedString == NULL)
{
break;
}
}
printf("%s\n", tokenizedString);
return tokenizedString;
}
int main(void)
{
char userCommand[255] = {0};
fgets(userCommand, sizeof(userCommand), stdin);
tokenizeString(userCommand);
}
最佳答案
Now, the first printf works but after that I get a Seg Fault. So
tokenizedString = strtok(NULL, " ");
must be causing the issue, right?
不,这是非常差的相关性。事实上,问题出在对 printf 的第二次调用中。当tokenizedString == NULL
时,您可以传递它tokenizedString
。指定的 %s
格式指定为期望指向以零结尾的字符数组的第一个字符的有效指针。传递它 NULL
是非法的,并且会导致未定义的行为(例如导致崩溃)。修复方法很简单:检查空指针值。当然,这同样适用于循环的第一次迭代
char *tokenizeString(char *userCommand)
{
char *tokenizedString;
int counterForToken;
tokenizedString = strtok(userCommand, " ");
for(counterForToken = 0; counterForToken != 3 && tokenizedString != NULL; counterForToken++)
{
printf("%s\n", tokenizedString);
tokenizedString = strtok(NULL, " ");
}
if(tokenizedString != NULL)
printf("%s\n", tokenizedString);
return tokenizedString;
}
关于c - strtok 导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53902538/