【问题标题】:C - tokenizing from scanfC - 从 scanf 标记化
【发布时间】: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");

标签: c token


【解决方案1】:

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

char str;

您只有存储 1 个字符的空间,strtok 函数将一个字符串作为参数,然后修改该字符串将其分割成片段。

为了让你这样做,你需要为字符串提供空间

char str[64]; 

C 中的字符串是一系列字符,后跟一个终止值 0,因此用 64 声明它意味着您可以输入最多 63 个字符的字符串。为了防止用户输入较长的字符串,您可以使用 fgets 等其他函数从键盘读取。

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

然后应用您的 strtok 调用。

【讨论】:

  • 还需要将'\n' 添加到" ,.-" 或以某种方式说明'\n' 应该代码使用fgets()
【解决方案2】:
scanf("%s\n", str);

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

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

【讨论】:

  • 它应该是 str[100]
【解决方案3】:

连同lurker的评论我会说,在你拥有char str[200]之后,你必须立即获得一条线路。使用getline

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

【讨论】:

  • 用getline代替scanf?
  • @donutjuice.:否则你将如何在字符串中获取空格分隔的单词..?
  • 我得到一个未定义的 getline() 引用
  • getline() 是一个常用函数,但不是 C 标准库的一部分 - 可能不可用。
  • @donutjuice.: 或者可以使用 fgets ......这也可以
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-21
  • 2010-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-11
  • 1970-01-01
相关资源
最近更新 更多