我知道[^ \ n]是一个分隔符,它使scanf扫描所有内容,直到“输入”键被命中。但我不知道“%[^ \ n]%* c”的剩余部分是用于什么的。另外,为什么我们必须在scanf函数中提及“&s”而不是“s”。
我试过这个:
char s[100];
scanf("%[^\n]s",s);
scanf("%[^\n]s",&s);
上面的scanf语句对我来说都是完全相同的。如果他们之间有任何差异,那是什么?
另外为什么我更喜欢scanf(“%[^ \ n]%* c”,&s);上述声明?
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
。
您可以使用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”);在最后一次陈述之前。