我无法使用fgets()
和strtok()
接收输入并相应地将其拆分。
假设我有一个输入1-9的主菜单,每个输入都会导致另一个功能。我只使用if语句和每个函数的break语句来做到这一点。现在让我们说另一个命令接受一个字符串,然后是一个空格,然后是2个整数,我将如何在菜单中将其写入?
这是菜单中的任何时间,它只能读取单个整数(1-9),并且还可以在该菜单中阅读"start 5,9,forward"
或"start ,4,2,backwards"
。我是否写了一个逻辑,说明是否"开始"正在输入,继续,但我不知道如何制作它,以便它在开始后读取空间输入并读取2个整数和最后一个字符串。
很抱歉,如果我的问题有点令人困惑,但我只是想知道一个例子,如果在一行中接收多个输入并能够操纵这些输入变量。
答案 0 :(得分:1)
使用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[^,' ']"
将读取输入,直到达到第一个,
或' '
(空格)。另外,将N替换为a
- 1;
%1d%*[^,' ']
将读取一位数的整数,并丢弃输入的其余部分,直到找到,
并将其存储在b
;
%N[^\n]
会读取该行的其余部分并将其存储在d
中。将N替换为d
- 1的大小。
您可以使用scanf进行大量技巧。 请注意,在这种情况下,所有空格在scanf的格式中都很重要。此外,我不会处理用户输入错误输入格式的情况,但这是可能的。