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 );
我一直在尝试扫描多个连续的字符串。
我知道您必须消除换行符,我也被告知“%[^\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 );