《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; }
额外细节说明
- 关于
strlen()的小坑:原代码里的strlen(buffer)会把fgets读取到的换行符\n也算作一个字符,导致统计结果比实际输入多1。用strcspn(buffer, "\n")可以精准定位换行符的位置,替换成字符串终止符\0后,统计的就是纯输入内容的长度了。 - 为什么传
sizeof(buffer)?这是安全编程的好习惯——如果用户输入的字符超过255个(数组要留一个位置给\0),fgets会自动截断输入,避免缓冲区溢出导致的程序崩溃。
内容的提问来源于stack exchange,提问作者Methodius5510
相关产品推荐
相关产品推荐

