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

《24小时学通C语言》第84页程序3在CodeBlocks中因fgets参数错误无法运行求助

问题排查与解决方案

首先,咱们直接揪出核心问题:你代码里的fgets()调用少了两个必要参数!

标准C中,fgets()的函数原型是:

char *fgets(char *str, int num, FILE *stream);

它必须接收三个参数:

  • 第一个是存储输入内容的字符数组(也就是你的buffer)
  • 第二个是数组的最大容量(用来防止缓冲区溢出,这里就是256)
  • 第三个是输入流(读取键盘输入的话,用stdin就对了)

你的代码里只写了fgets( buffer );,完全不符合标准语法,编译器自然会报错。至于专业书籍里为啥会出现这个问题?大概率是印刷失误——排版时漏掉了后面的参数,这类小纰漏在技术书籍里偶尔会发生。

修正后的完整代码

/* Sams teachyourself C in one hour a day page 84 program 3 (fixed) */
#include <stdio.h>
#include <string.h>

int main( void )
{
    char buffer[256];
    printf( "Enter your name and press <Enter>:\n");
    // 补充fgets的完整参数
    fgets( buffer, sizeof(buffer), stdin );
    
    // 额外优化:去掉fgets读取到的换行符(可选,但统计结果更准确)
    buffer[strcspn(buffer, "\n")] = '\0';
    
    printf( "\nYour name has %d characters and spaces!", (int)strlen( buffer ));
    return 0;
}

额外细节说明

  1. 关于strlen()的小坑:原代码里的strlen(buffer)会把fgets读取到的换行符\n也算作一个字符,导致统计结果比实际输入多1。用strcspn(buffer, "\n")可以精准定位换行符的位置,替换成字符串终止符\0后,统计的就是纯输入内容的长度了。
  2. 为什么传sizeof(buffer)?这是安全编程的好习惯——如果用户输入的字符超过255个(数组要留一个位置给\0),fgets会自动截断输入,避免缓冲区溢出导致的程序崩溃。

内容的提问来源于stack exchange,提问作者Methodius5510

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 15:37:51