C 可选匹配

C 可选匹配,c,scanf,C,Scanf,所以我必须让scanf读入几个由空格分隔的字符串。然而,我事先不知道需要读取多少字符串,它可以是1到5之间的任意值,但我似乎无法让scanf在输入中按enter键后停止尝试读取。我试过做一些简单的%s%s%s%s,但是你可以想象,在只说一两个单词后,它仍然希望读更多的内容,然后我也试着做%s%*[^\n]%s%*[^\n]%s%*[\n]%s%*[\n]%s%*[^\n],这样它会尝试在新行字符后停止,但也不起作用 那么,让scanf拥有一些可选输入部分的最佳方法是什么呢 谢谢 编辑:我知道st

所以我必须让scanf读入几个由空格分隔的字符串。然而,我事先不知道需要读取多少字符串,它可以是1到5之间的任意值,但我似乎无法让scanf在输入中按enter键后停止尝试读取。我试过做一些简单的
%s%s%s%s
,但是你可以想象,在只说一两个单词后,它仍然希望读更多的内容,然后我也试着做
%s%*[^\n]%s%*[^\n]%s%*[\n]%s%*[\n]%s%*[^\n]
,这样它会尝试在新行字符后停止,但也不起作用

那么,让scanf拥有一些可选输入部分的最佳方法是什么呢

谢谢


编辑:我知道strtok和fgets,我只是想看看是否有办法用scanf来做到这一点,用
fgets
读一行,然后
strotk
/
sscanf
来解析它怎么样?然后您就可以决定用户输入了多少字符串。

scanf
不强制读取整个格式字符串,一旦获得无效输入或没有剩余输入,它就会中止

发件人:

成功时,函数将返回成功的项数 阅读此计数可以与预期的读数数匹配或更少, 即使是零,如果发生匹配失败

下面的代码告诉您在
scanf
期间读取了多少个参数:

char s1[10], s2[11], s3[11], s4[11], s5[11];
int read = scanf("%10s %10s %10s %10s %10s", s1, s2, s3, s4, s5);
printf("Read %d strings", read);

如果您输入
aaa bbb ccc
并点击回车键,它会打印3,对于
aaa bbb ccc ddd
它会打印4,等等。

这就是我可能要做的事情,我只是想知道是否有办法做到这一点。@legion可能有办法,但使用
scanf
本质上是不可靠的。您无法控制用户输入的内容。另一方面,当您使用
fgets
时,您将所有字符串都放在缓冲区中,您可以完全自由地解析它,而不受
scanf
的阻碍。