2017-04-08 102 views
0

如何处理可变数量的scanf输入? 我正在扫描命令,其中一些是1.字命令,但一些需要数字参数。 scanf是否允许以下​​内容?可变的scanf输入

scanf(" %s %d", command, argument); 

如果只输入一个值,会忽略“参数”吗? 另一种选择我虽然之一是

scanf(" %s", command) 
if (strcmp(command, "somethin") { 
     scanf("%d", argument); } 

但是,这将创建一个新行权?终端必须以“>命令参数” 的形式接收输入,我的问题是,如何解决具有可变数量输入的问题。

+2

第一个将等待你输入一个参数。用'fgets()'读一行,然后用'sscanf()'来解析它。 – Barmar

+2

您也可以阅读该行,然后使用'strtok()'将其分割为令牌,然后解析。 – Barmar

+1

你几乎肯定要读整行然后处理该行 –

回答

2

不,它不会“创建换行符”。 scanf完全不知道任何换行符。 scanf将输入流视为由空格分隔的数据的线性序列。 Newline只是空白,与其他任何空白都没有什么不同。可以“看到”换行符的唯一scanf格式说明符是%c%[]。您的%s%d完全不符合新行。

这意味着你的第二个例子是正确的(在scanf的自然限制内)。它不会“创建新行”。如果你在一行提供输入(如somethin 42),它将读取一行。

您可能会遇到“相反”的问题:如果用户忘记在一行中输入所需参数,则下一个scanf将在下一行等待它。并在下一行。并在下一行......直到用户终于提供它。我不确定这种行为是否适合你。如果不是,那么更好的办法是通过fgets使用专用的基于行的输入,然后手动解析该行。

P.S.没有理由在空格前面加上%s%d

+0

fgets是否从指定文件读取? –

+0

嗯,其实我现在试过了,它实际上有点怪异。它设法逃脱并且无限循环。它忽略了“如果”测试,只是简单地忽略了我输入的命令,而收益基本上会影响输入。编辑:nvm修复它。错误地处理了strcmp输入。 –

+3

@ZergOvermind'fgets'从流中读取。你可以指定'stdin'作为那个流。实际上,'scanf'实质上只是'fscanf(stdin,...'的缩写 – AnT