我知道[^ \ n]是分隔符,它使scanf扫描所有内容,直到按下“ enter”键为止。但是我不知道“%[^ \ n]%* c” 的其余用途是什么。另外,为什么在scanf函数中必须提到“&s”而不是“ s”。
我尝试运行此命令:
char s[100];
scanf("%[^\n]s",s);
scanf("%[^\n]s",&s);
两者以上的 scanf语句对我来说完全相同。如果它们之间有什么区别,那是什么?
也我为什么要使用 scanf(“%[^ \ n]%* c”,&s); 要以上声明吗?
答案 0 :(得分:5)
scanf("%[^\n]s",&s);
有很多麻烦:
不检查返回值。
没有超速保护
不消耗'\n'
仅在s
上没有分配'\n'
s
中不需要"%[^\n]s"
格式错误的&s
类型。
scanf("%[^\n]s",s);
只有一个少问题(最后一个)。
使用fgets(s, sizeof s, stdin)
if (fgets(s, sizeof s, stdin)) {
s[strcspn(s, "\n")] = 0; // Lop off potential ending \n
// Success
} else {
// failure
}
如果不检查返回值,则无法确定读取成功,并且s
的状态不确定。
输入第100个字符会怎样? -“非常糟糕。不好。不好。” Necron 99, Wizards 1977
'\n'
'\n'
保留在stdin
中,以阻止下一次阅读。
s
上没有分配'\n'
如果输入以'\n'
开头,则scanf()返回且s
不变。未分配""
。
"s"
中的"%[^\n]s"
"s"
不是说明符"%[^\n]"
的一部分。放下它。
&s
的格式错误。 %[...]
匹配char *
,而不是指向char[100]
(UB)之类的&s
的指针。
答案 1 :(得分:0)
您可以使用scanf(“%s”,s)将字符串作为C中的输入。但是,它只接受字符串,直到找到第一个空格为止。
为了将一行作为输入,可以使用scanf(“%[^ \ n]%* c”,s);其中s定义为char s [MAX_LEN],其中MAX_LEN是s的最大大小。这里,[]是扫描集字符。 ^ \ n代表输入,直到没有换行为止。然后,使用此%* c读取换行符,在这里使用的*表示该换行符已被丢弃。
注意:输入字符和字符串后,按上述语句输入句子将不起作用。这是因为在每一行的末尾都有一个换行符(\ n)。因此,语句:scanf(“%[^ \ n]%* c”,s);将不起作用,因为最后一条语句将从前一行读取换行符。这可以通过多种方式来处理,其中之一是:scanf(“ \ n”);最后一个语句之前。