C语言使用fgets实现256字符输入截断功能运行结果不符合预期如何修复
异常产生原因
fgets读取时最多只会读取参数指定长度减1的字符,你传入长度为256,因此单次最多读取255个字符到string数组,末尾自动补\0。当输入的字符串总长度超过255个字符时,第一次调用fgets只会读取前255个字符,此时string末尾没有换行符\n。- 你写的do-while循环逻辑为:只要
string末尾不是\n,就重新调用fgets读取输入,新读取的内容会直接覆盖string中原有的内容。因此输入超长时,循环会反复读取剩余的输入内容、不断覆盖string,直到读到带有\n的最后一段输入为止,最终输出的自然就是输入的末尾部分,而非你预期的前256字符。
修复方案
如果你需要保留读取到的前255个字符,同时清空输入缓冲区中剩余的内容,避免影响后续的输入操作,可修改为如下逻辑:
#include<stdio.h> #include<string.h> int main(){ printf("\nEnter a new string.\n"); char string[256]; // 第一次读取输入 fgets(string, 256, stdin); // 判断是否没有读到换行符(说明还有剩余内容在缓冲区) if (strlen(string) > 0 && string[strlen(string) - 1] != '\n') { // 循环读取并丢弃缓冲区剩余内容,直到读到换行或者缓冲区为空 int c; while ((c = getchar()) != '\n' && c != EOF); } printf("\n\n stringa %s\n", string); return 0; }
如果你的需求是允许用户输入多行,只保留最后一行的前255个字符,可调整循环逻辑,每次读取新内容前先判断是否需要保留之前的内容即可。
内容的提问来源于stack exchange,提问作者Gio Bur
相关产品推荐
相关产品推荐

