C语言fgets实现单单词逐行输出问题:多余空行排查求助
问题原因与解决方案
这个问题我之前也碰到过,根源在于fgets的一个容易忽略的特性——它会把你输入时按下的回车键(也就是换行符\n)也一起读取并存入数组里,而不是像你以为的那样只读取单词本身。
具体原因分析
当你输入一个无空格单词然后按回车时,fgets会把以下内容依次存入array数组:
- 单词的每个字符
- 换行符
\n(你按下回车产生的) - 字符串结束符
\0(自动添加的)
你的循环条件是array[i] != '\0',所以那个\n也会被遍历到,然后执行printf("%c\n", array[i])——这就相当于先打印一个换行(来自\n本身),再打印一个printf自带的换行,直接就多出来两行空行啦。
解决方法:提前移除换行符
我们只需要在读取完字符串后,把数组里的\n替换成\0,让循环提前终止即可。这里有两种常用方式:
方式一:手动遍历替换
#include <stdio.h> #define MAX_LINE 4096 int main(void) { int i; char array[MAX_LINE]; printf("Enter a string: "); fgets(array,MAX_LINE,stdin); // 遍历找到换行符并替换为结束符 for (i = 0; array[i] != '\0'; i++) { if (array[i] == '\n') { array[i] = '\0'; break; } } for(i=0; array[i]!='\0'; i++){ printf("%c\n",array[i]); } return 0; }
方式二:用strcspn函数简化(推荐)
strcspn会返回字符串中第一个指定字符的位置,我们可以用它快速定位\n并替换:
#include <stdio.h> #include <string.h> // 需要包含这个头文件 #define MAX_LINE 4096 int main(void) { int i; char array[MAX_LINE]; printf("Enter a string: "); fgets(array,MAX_LINE,stdin); // 直接把换行符替换为结束符 array[strcspn(array, "\n")] = '\0'; for(i=0; array[i]!='\0'; i++){ printf("%c\n",array[i]); } return 0; }
额外说明
如果用户输入的字符串长度刚好达到MAX_LINE-1,fgets会因为达到长度限制而不读取换行符,这时候上面的代码也不会出错——strcspn会返回字符串的长度,替换\0到数组末尾不会产生任何问题。
内容的提问来源于stack exchange,提问作者dumpling_mash
相关产品推荐
相关产品推荐

