strtok 导致分段错误
strtok is causing a Segmentation Fault
我必须得到字符串中的第三个单词,想使用 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;
}
我必须得到字符串中的第三个单词,想使用 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;
}