为何这段C语言代码输出结果不正确?求解决方案
C语言代码输出错误的原因及解决办法
错误代码示例
char nation[100]; printf("Enter Your Name : "); gets(nation); int size = strlen(nation); printf("Output = %f\n", size);
错误原因
gets函数的安全与兼容性问题:gets是已被C标准废弃的函数,它不会检查输入长度,当输入字符超过数组nation的容量时会直接导致缓冲区溢出,引发程序崩溃或未定义行为;且从C11标准开始,gets已从标准库中移除,多数编译器会直接报错。- 格式化输出类型不匹配:
strlen的返回值是size_t(无符号整数类型),但代码用浮点数格式符%f输出整数变量,参数类型与格式符完全不匹配,必然导致输出结果错误。另外将size_t赋值给int变量,当字符串长度超过int取值范围时还会出现溢出问题。
解决办法
- 替换
gets为安全输入函数:用fgets替代gets,fgets可以指定最大输入长度,从根源避免缓冲区溢出。注意fgets会把输入的换行符读入数组,需手动去除。 - 使用正确的格式化输出符:针对
size_t类型变量,用%zu格式符输出;若要转成int类型,需确保字符串长度在int取值范围内,此时用%d格式符。
修改后的完整代码
#include <stdio.h> #include <string.h> int main() { char nation[100]; printf("Enter Your Name : "); // 用fgets读取输入,限制长度为数组大小 fgets(nation, sizeof(nation), stdin); // 移除fgets读入的换行符 nation[strcspn(nation, "\n")] = '\0'; size_t size = strlen(nation); // 使用%zu输出size_t类型 printf("Output = %zu\n", size); return 0; }
内容的提问来源于stack exchange,提问作者Md Robiul Hridoy
相关产品推荐
相关产品推荐

