无法理解fgets输出:输入字符数为3时仅显示2个字符的问题
问题解决:输入指定长度字符串时显示不全
问题根源
fgets函数的第二个参数指定的是最大可读入的字符总数(包含字符串结束符\0)。当你申请了n个字符的内存空间,并用fgets(string, n, stdin)读取时,最多只能存入n-1个有效字符——最后一个位置必须留给\0来标记字符串结束。这就是输入3个字符时,程序仅显示前2个的原因。
修正方案
需要做两处关键修改:
- 内存分配时多申请1个字符的空间,专门用来存放
\0 - 调用
fgets时,把最大读取数设为n+1,确保能容纳n个有效字符加结束符
修正后的完整代码:
#include <stdlib.h> #include <stdio.h> #include <string.h> int main(void) { // 提示用户输入想要输入的字符数 printf("Enter how many characters you want to write. \n"); int n; int itemsRead = scanf_s("%d", &n); if (itemsRead != 1) { // scanf未读取到预期输入,处理错误 printf("Error: Input is not in the expected format.\n"); return 1; // 返回非零值表示错误 } // 清空输入缓冲区 int c; while ((c = getchar()) != '\n' && c != EOF); // 多分配1个字节用于存储字符串结束符'\0' char *string = NULL; string = (char *)malloc((n + 1) * sizeof(char)); if (string != NULL) { printf("Enter the string \n"); // 最大读取n+1个字符(含'\0'),确保能存下n个有效字符 fgets(string, n + 1, stdin); // 去掉fgets读取的换行符(如果存在) string[strcspn(string, "\n")] = '\0'; printf("string is: %s\n", string); } free(string); string = NULL; }
额外说明:添加strcspn调用是为了移除fgets可能读取到的换行符(用户输入完字符串按回车时,该换行符会被fgets一并读入),让输出结果更符合预期。
内容的提问来源于stack exchange,提问作者Mohamed Taha
相关产品推荐
相关产品推荐

