在 C 中通过 white space 将用户输入的字符串拆分为单独的标记
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 one 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'
字符的所有单词。但是,在这种情况下,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;
}
Example/Output
$ ./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);
并完成同样的事情。
我正在尝试逐字打印用户输入的字符串,或标记化。我有:
char input [1000];
char* token;
scanf("%s", input);
token = strtok (input," ,.");
while (token != NULL){
printf("%s\n",token);
token = strtok(NULL, " ,.");
}
当我在控制台输入内容时,说 "test test one 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'
字符的所有单词。但是,在这种情况下,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;
}
Example/Output
$ ./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);
并完成同样的事情。