我在其他任何地方都找不到答案。
%[^\n]
-运行此命令时,按Enter后,scanf
正在获取输入并终止。 (可能将\n
留在输入系统中)
%[^\n]\n
-这是一个输入,但是我按上述输入后,scanf
没有立即终止。我打了更多的回车,它使更多的新行。当我给一个字符然后按Enter时,它最终终止。例如:
int main(void)
{
char s[100];
scanf("%[^\n]\n", s);
printf("%s", s);
return 0;
}
结果:
上一个:
%[^\n]%*c
-输入一些内容并按Enter键。 scanf
立即终止。
这三者如何工作,它们有何不同?
全部3个都以"%[^\n]"
开头。
"%[^\n]"
是较差的代码2,它没有宽度限制,容易受到缓冲区溢出的影响。使用一个[[width限制,例如%99[^\n]
和char s[100];
。
'\n'
1。 '\n'
被放回。所有其他字符都保存在匹配目标的数组s
中。
'\n'
),则说明符失败,并且scanf()
返回无更改s
。没有附加null character
s
后面附加一个空字符
,并继续扫描格式的下一部分。"\n"
的行为与" "
,"\t"
等类似,并且读取和抛弃0个或更多空白字符。它将继续这样做,直到读取了非空白1。该非空白字符将重新放入stdout
。
line
才能看到下一个非空白。 使用scanf()
,格式末尾的"\n"
是坏
。"%*c"
读取1个字符1并将其丢弃。此说明符不影响返回计数。
fgets()
。 char s[100];
if (fgets(s, sizeof s, stdin)) {
s[strcspn(s, "\n")] = '\0'; // To lop off potential trailing \n
较小的替代方法是
char s[100] = { 0 }; scanf("%99[^\n]", s); scanf("%*1[\n]"); // read the next character if it is a \n and toss it.
...或文件结尾或罕见输入错误。1
2
IMO,比gets()
差。