C语言查找字符串元音时scanf失效fgets正常的原因求解
你写的scanf语句存在两个核心错误,按影响优先级排序如下:
数组访问越界,传入的存储地址完全错误
你写的参数是&str[100],C语言中数组下标从0开始计数,你定义的char str[100]合法的下标范围是0~99,str[100]本身就是数组边界外的非法内存地址。把这个地址传给scanf做写入目标,会直接触发缓冲区溢出,属于未定义行为,程序运行结果完全不可预期,崩溃、输出乱码、无结果都是常见表现。
正确的传参应该传入数组首地址,写str或者&str[0]都可以。没有限制输入长度,存在安全隐患
即使你修正了地址问题,%[^\n]的写法不会限制读取的字符长度,如果用户输入的字符串长度超过99(需要留1个字符位置存储字符串结束符\0),依然会发生缓冲区溢出。更安全的写法是加上长度限制:%99[^\n]。
额外补充:你写法里的%*c作用是丢弃输入缓冲区里残留的换行符,但如果%[^\n]因为用户直接输入回车匹配失败时,%*c不会执行,换行符会残留在输入缓冲区,后续有其他输入操作时可能会触发异常,这属于边缘场景问题,不是你这次代码跑不通的核心原因。
修正后的可用scanf写法参考:
scanf("%99[^\n]%*c", str);
内容的提问来源于stack exchange,提问作者Vaibhav Katre
相关产品推荐
相关产品推荐

