You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何这段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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 06:35:26