C-从scanf标记化

C-从scanf标记化,c,token,C,Token,我想标记用户输入的任何字符串。我的代码是: #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, " ,.-");

我想标记用户输入的任何字符串。我的代码是:

#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;
}
#包括
#包括
#包括
内部主(空)
{
char-str;
字符*令牌;
printf(“输入字符串:”);
scanf(“%s\n”和&str);
标记=strtok(&str,“,.-”);
while(令牌!=NULL)
{
printf(“%s\n”,标记);
令牌=strtok(空,,.-”;
}
返回0;
}

但是如果我输入一个像“dogs is brown”这样的字符串,它只会返回“dogs”。如何让它返回字符串中的每个单词?提前谢谢。

连同潜伏者的评论,我会说,在你有
char str[200]
之后,你必须马上得到一行。使用
getline


或者,由于避免使用
gets
,您可以使用
fgets
读取字符串中的一行。

以及潜伏者的评论,我会说,在您使用
char str[200]
之后,您必须立即获取一行。使用
getline


或者,由于避免使用
获取
,您可以使用
fgets
读取字符串中的一行。

您就快到了,但当您写入时

char str;
您只有存储1个字符的空间,strtok函数将一个字符串作为参数,然后修改该字符串并将其切碎

为了做到这一点,您需要为字符串提供空间

char str[64]; 
C中的字符串是一系列字符,后跟一个终止的0值,因此用64声明它意味着您可以输入一个最多63个字符的字符串。为了防止用户输入更长的字符串,可以使用另一个函数(如fgets)从键盘读取

fgets( str, sizeof(str), stdin );

然后应用你的strtok调用。

你就快到了,但是当你写的时候

char str;
scanf("%s\n", str);
您只有存储1个字符的空间,strtok函数将一个字符串作为参数,然后修改该字符串并将其切碎

为了做到这一点,您需要为字符串提供空间

char str[64]; 
C中的字符串是一系列字符,后跟一个终止的0值,因此用64声明它意味着您可以输入一个最多63个字符的字符串。为了防止用户输入更长的字符串,可以使用另一个函数(如fgets)从键盘读取

fgets( str, sizeof(str), stdin );
然后应用strtok调用

scanf("%s\n", str);
输入str的正确方法。删除“&”

另外,在输入字符串时,请将
char str
声明为
char str[200]

输入str的正确方法。删除“&”



另外,当您输入字符串时,请将
char str
声明为
char str[200]
,哦,这不好。您只为字符串分配了一个字节(
char str;
是一个字节)。因此,当调用
scanf
时,您正在覆盖堆栈。您需要声明一个数组(例如,
char str[200];
在本例中为200字节,或者您希望它在合理范围内有多大),然后调用
scanf(“%s\n”,str)
strtok(str,,.-”。它不能解决您报告的问题,但它可以防止您的代码做坏事。@潜伏者啊,我现在明白了。是否有一个大小分配将自动适应用户输入的字符串大小?您可以尝试<代码> GETLION(3)。<代码> SCANF(“%s\n”…)/代码>只会扫描到空白(见手册页的<代码> SCANF),所以只需读取一个单词即可。
并使用
token=strtok(…,“,.-\n”)哦,这不好。您只为字符串分配了一个字节(
char str;
是一个字节)。因此,当调用
scanf
时,您正在覆盖堆栈。您需要声明一个数组(例如,
char str[200];
在本例中为200字节,或者您希望它在合理范围内有多大),然后调用
scanf(“%s\n”,str)
strtok(str,,.-”。它不能解决您报告的问题,但它可以防止您的代码做坏事。@潜伏者啊,我现在明白了。是否有一个大小分配将自动适应用户输入的字符串大小?您可以尝试<代码> GETLION(3)。<代码> SCANF(“%s\n”…)/代码>只会扫描到空白(见手册页的<代码> SCANF),所以只需读取一个单词即可。
并使用
token=strtok(…,“,.-\n”)
使用getline代替scanf?@donutjuice.:否则,如何在字符串中获得空格分隔的单词..?我得到了对getline()的未定义引用
getline()
是一个常见函数,但不是C标准库的一部分-可能不可用。@donutjuice.:或者可以使用FGET…这也可以使用getline代替scanf?@donutjuice.:否则如何获得字符串中的空格分隔字..?我得到了对getline()的未定义引用
getline()
是一个常用函数,但是不是C标准库的一部分-可能不可用。@donutjuice:或者可以使用fgets…这也可以使用它应该是str[100]它应该是str[100]还需要将
'\n'
添加到
,.-“
或以某种方式解释
'\n'
应该使用
fgets()
。还需要将
'\n'
添加到
“,.-”
或以某种方式说明
'\n'
应使用
fgets()