通过C中的空格将用户输入的字符串拆分为单独的标记

时间:2015-10-20 23:59:57

标签: c string split token tokenize

我正在尝试逐字打印用户输入的字符串,或者标记为。我有:

char input [1000]; 

char* token;
scanf("%s", input);

token = strtok (input," ,.");

while (token != NULL){
    printf("%s\n",token);
    token = strtok(NULL, " ,.");
}

当我在控制台输入内容时,说“测试一两三。”,只打印出第一个单词。

2 个答案:

答案 0 :(得分:0)

您只使用scanf扫描第一个单词。 scanf期望格式化字符串输入,即在您的情况下:

scanf("%s %s %s %s", string1, string2 ...

这对你没用。您应该考虑使用fgets

请注意gets无法限制输入大小。如果不是仅由您使用,则可能对您的记忆非常危险。使用fgets

Here is a live example.

答案 1 :(得分:0)

您与strtok走在正确的轨道上。虽然您可以使用scanf,但您必须硬编码您计划转换的最大字符串数量存在重大限制。如果你使用类似的东西:

scanf("%s %s %s %s", string1, string2 ...

您转换为令牌将失败:

one two three four five

因此,除非在编写代码之前保证设定数量的字符串,否则scanf将无效。相反,与您的初始尝试一样,您选择strtok将提供处理无限数量单词的灵活性。

您最初阅读输入的唯一问题是选择scanf "%s"文件说明符,其中转换在遇到第一个空格时停止。如果您只是将转换说明符更改为"%[^\n]",那么您就可以读取字符串中的所有单词,直到'\n'字符。但是,在这种情况下,scanf的更好替代方案可能是fgets。一个简单的例子是:

#include <stdio.h>
#include <string.h>

#define MAXC 256

int main (void) {

    char buf[MAXC] = {0};
    char *p = buf;

    printf ("\n enter words: ");
    fgets (buf, MAXC, stdin);

    printf ("\n tokens:\n\n");
    for (p = strtok (buf, " "); p; p = strtok (NULL, " \n"))
        printf ("   %s\n", p);

    putchar ('\n');

    return 0;
}

示例/输出

$ ./bin/strtok_fgets

 enter words: a quick brown fox jumps over the lazy dog.

 tokens:

   a
   quick
   brown
   fox
   jumps
   over
   the
   lazy
   dog.

如果您想使用scanf,那么您可以将上面的fgets替换为scanf ("%255[^\n]", buf);并完成同样的事情。