scanf格式说明符中星号的含义是什么?两条相关scanf语句有何区别?
关于C语言scanf格式符星号及相关用法解答
1. scanf格式说明符中星号的含义
- 这个星号是赋值抑制符,也叫跳过符。作用是匹配对应格式的输入内容,但不会把匹配到的内容存储到任何变量中,也不会占用scanf的参数列表位置。
- 举个简单示例:
scanf("%d%*c%d", &a, &b);当输入内容为12,34时,中间的逗号会被%*c匹配到并直接丢弃,最终a赋值为12,b赋值为34,不需要额外定义变量存储这个分隔字符。
2. 两条scanf语句的含义与区别
两条语句各自的含义
scanf("%[^\n]", s);%[^\n]是扫描集格式符,含义是匹配所有**不是换行符\n**的字符,直到遇到换行符为止,把匹配到的所有字符存储到字符数组s中。- 该语句执行完成后,输入缓冲区里的换行符
\n会被完整保留,既不会被读取也不会被丢弃。
scanf("%[^\n]%*c", s);- 前半部分
%[^\n]的作用和上面完全一致,读取所有非换行符到s中。 - 后面的
%*c就是通过赋值抑制符,匹配并丢弃输入缓冲区里剩余的那个换行符\n,执行完成后缓冲区不会残留换行符。
- 前半部分
二者的核心区别
最本质的差异是对输入缓冲区残留字符的处理逻辑:
- 执行
scanf("%[^\n]", s);后,如果后续再调用其他读取输入的函数(比如getchar、下一条scanf),第一个读取到的会是残留的\n,很容易导致输入逻辑异常。比如连续调用两次该语句,第二次会直接匹配到残留的换行符,匹配失败返回0,s不会被赋值。 - 执行
scanf("%[^\n]%*c", s);后,换行符已经被主动丢弃,后续的输入读取操作可以正常获取到新的输入内容。
注意:两种写法都存在缓冲区溢出风险,如果输入的字符长度超过s的容量,会发生越界写,生产环境建议指定长度限制,比如
%100[^\n](100为s的最大可存储长度减1)来避免溢出问题。
内容的提问来源于stack exchange,提问作者Tawhid
相关产品推荐
相关产品推荐

