【发布时间】:2015-10-23 03:04:18
【问题描述】:
我想标记用户输入的任何字符串。我的代码是这样的:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char str;
char *token;
printf("Enter a string: ");
scanf("%s\n", &str);
token = strtok(&str, " ,.-");
while(token != NULL)
{
printf("%s\n", token);
token = strtok(NULL, " ,.-");
}
return 0;
}
但是如果我输入一个像“dogs are brown”这样的字符串,它只会返回“dogs”。我怎样才能让它返回字符串中的每个单词?提前致谢。
【问题讨论】:
-
哦,这不好。您只为您的字符串分配了一个字节(
char str;是一个字节)。因此,当您调用scanf时,您正在覆盖您的堆栈。您需要声明一个数组(例如,char str[200];在这种情况下为 200 个字节 - 或者您希望它在合理范围内的大小),然后调用scanf("%s\n", str);和strtok(str, " ,.-");。它不会消除您报告的问题,但可以防止您的代码做坏事。 -
@lurker 啊,我现在明白了。是否有大小分配会自动适应用户输入的字符串大小?
-
你可以试试
getline(3)。 -
scanf("%s\n"...)只会扫描到空白处(参见scanf的手册页),所以它只是从一个单词开始。 -
阅读
fgets()的行并使用token = strtok(..., " ,.-\n");