C中连续scanf的“%[^\n]%*c”和“%[^\n]”之间的区别

Difference between " %[^\n]%*c" and " %[^\n]" for consecutive scanf in C

我一直在尝试扫描多个连续的字符串。

我知道您必须消除换行符,我也被告知“%[^\n]%*c”是正确的方法。 但在我的测试中,“ %[^\n]” 效果更好,因为它更简单,而且如果我尝试直接给它换行也不会出错,它会一直等待一个字符串。 到目前为止一切顺利。

在任何情况下“%[^\n]%*c”是更好的方法吗?

非常感谢!

此格式字符串 " %[^\n]" 允许跳过前导白色 space,包括之前调用 scanf 存储在输入缓冲区中的换行符 '\n'

但是,如果您在使用这样的格式字符串调用 scanf 之后使用 fgets,那么 fgets 将读取一个空字符串,因为换行符 '\n'将出现在输入缓冲区中。

使用此格式字符串 "%[^\n]%*c" 调用 scanf 后,您可以调用 fgets,因为换行符将被删除。

注意格式串"%[^\n]%*c"" %[^\n]%*c"有不同的效果。第一个不允许跳过与第二个格式字符串相反的前导白色 space 字符。

为了更安全地调用 scanf,您应该指定一个长度修饰符,例如

char s[100];
scanf( " %99[^\n]", s );