我如何使用 fgets 和 strtok 获取多个输入?
How do i use fgets and strtok to get multiple inputs?
我在使用 fgets()
和 strtok()
接收输入并相应地拆分它们时遇到问题。
假设我有一个接受输入 1-9 的主菜单,并且每个输入都指向另一个功能。我用 just if 语句和每个函数的 break 语句来做到这一点。现在假设有另一个命令接受一个字符串,然后是一个 space,然后是 2 个整数,我将如何在我的菜单中写它?
这是菜单中的任何时间,它只能读取单个整数 (1-9),也可以读取菜单中的 "start 5,9,forward"
或 "start ,4,2,backwards"
。我是否编写了一个逻辑,说明如果 "start" 正在输入,继续继续,但我不知道如何制作它以便在开始和阅读后读取 space 输入2 个整数和最后一个字符串。
抱歉,如果我的问题有点令人困惑,但我只想知道一个例子,如果在一行中接收多个输入并能够操纵这些输入变量。
使用fgets
和strtok
:
@Cool Guy 说的差不多。
...
fgets(buff, sizeof buff, stdin);
char a[25], d[25];
int b, c;
char *p = strtok(buff, ", "); //this will cut the input at an occurrence of `,` or `' '`, whatever happens first. At this point you would have the string "start" pointed by `p`.
strcpy(a, p);
p = strtok(NULL, ", ");
if(p) {
b = atoi(p);
if(b < 0 || b > 9) {
//input error
}
}
p = ...
其余类推
使用scanf解决方案:
你可以使用scanf读取输入(是的,它是一个强大的功能)。
scanf(" %N[^,' '] ,%1d%*[^,' '] ,%1d , %N[^\n]", a, &b, &c, d);
" %N[^,' ']"
将读取输入,直到到达第一个 ,
或 ' '
(空白 space)。另外,将 N 替换为 a
- 1;
的大小
%1d%*[^,' ']
将读取一个只有一位的整数并丢弃输入的其余部分,直到找到 ,
并将其存储在 b
;
%N[^\n]
将读取该行的其余部分并将其存储在 d
中。将 N 替换为 d
- 1.
的大小
scanf 可以使用很多技巧。
请注意,在这种情况下,所有 whitespaces 在 scanf 的格式中都很重要。此外,我不会处理用户键入错误输入格式的情况,但这是可能的。
我在使用 fgets()
和 strtok()
接收输入并相应地拆分它们时遇到问题。
假设我有一个接受输入 1-9 的主菜单,并且每个输入都指向另一个功能。我用 just if 语句和每个函数的 break 语句来做到这一点。现在假设有另一个命令接受一个字符串,然后是一个 space,然后是 2 个整数,我将如何在我的菜单中写它?
这是菜单中的任何时间,它只能读取单个整数 (1-9),也可以读取菜单中的 "start 5,9,forward"
或 "start ,4,2,backwards"
。我是否编写了一个逻辑,说明如果 "start" 正在输入,继续继续,但我不知道如何制作它以便在开始和阅读后读取 space 输入2 个整数和最后一个字符串。
抱歉,如果我的问题有点令人困惑,但我只想知道一个例子,如果在一行中接收多个输入并能够操纵这些输入变量。
使用fgets
和strtok
:
@Cool Guy 说的差不多。
...
fgets(buff, sizeof buff, stdin);
char a[25], d[25];
int b, c;
char *p = strtok(buff, ", "); //this will cut the input at an occurrence of `,` or `' '`, whatever happens first. At this point you would have the string "start" pointed by `p`.
strcpy(a, p);
p = strtok(NULL, ", ");
if(p) {
b = atoi(p);
if(b < 0 || b > 9) {
//input error
}
}
p = ...
其余类推
使用scanf解决方案:
你可以使用scanf读取输入(是的,它是一个强大的功能)。
scanf(" %N[^,' '] ,%1d%*[^,' '] ,%1d , %N[^\n]", a, &b, &c, d);
" %N[^,' ']"
将读取输入,直到到达第一个 ,
或 ' '
(空白 space)。另外,将 N 替换为 a
- 1;
%1d%*[^,' ']
将读取一个只有一位的整数并丢弃输入的其余部分,直到找到 ,
并将其存储在 b
;
%N[^\n]
将读取该行的其余部分并将其存储在 d
中。将 N 替换为 d
- 1.
scanf 可以使用很多技巧。 请注意,在这种情况下,所有 whitespaces 在 scanf 的格式中都很重要。此外,我不会处理用户键入错误输入格式的情况,但这是可能的。