繁体   English   中英

用C中的空格将用户输入的String拆分为单独的标记

[英]Splitting a user-entered String into separate tokens by white space in C

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

char input [1000]; 

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

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

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

当我在控制台中输入内容时,说出“ test test a two three ..”,仅输出第一个单词。

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

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

这对您没有用。 您应该研究使用fgets

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

这是一个实时示例。

您使用strtok走上了正确的路。 尽管可以使用scanf ,但是存在一个明显的限制,即必须对计划转换的最大字符串数进行硬编码 如果您使用类似:

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

您转换为令牌的操作将因以下原因而失败:

one two three four five

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

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

#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); 并完成同样的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM