如何使用fgets和strtok获取多个输入?

时间:2016-04-16 13:28:45

标签: c fgets strtok

我无法使用fgets()strtok()接收输入并相应地将其拆分。

假设我有一个输入1-9的主菜单,每个输入都会导致另一个功能。我只使用if语句和每个函数的break语句来做到这一点。现在让我们说另一个命令接受一个字符串,然后是一个空格,然后是2个整数,我将如何在菜单中将其写入?

这是菜单中的任何时间,它只能读取单个整数(1-9),并且还可以在该菜单中阅读"start 5,9,forward""start ,4,2,backwards"。我是否写了一个逻辑,说明是否"开始"正在输入,继续,但我不知道如何制作它,以便它在开始后读取空间输入并读取2个整数和最后一个字符串。

很抱歉,如果我的问题有点令人困惑,但我只是想知道一个例子,如果在一行中接收多个输入并能够操纵这些输入变量。

1 个答案:

答案 0 :(得分:1)

使用fgetsstrtok

这几乎是@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的格式中都很重要。此外,我不会处理用户输入错误输入格式的情况,但这是可能的。