为何按CTRL+D退出循环后程序不等待字符串输入?
问题分析与解决方案:Ctrl+D触发EOF后程序无法继续读取输入
原代码
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char c, char_array[100]; int i = 0; printf("Enter characters (press CTRL+D to end):\n"); while(fgets(char_array+i,sizeof(char_array)-i,stdin)) { i = i + strlen(char_array+i); if(char_array[i-1] == EOF) break; } char_array[i-1] = '\0'; strtok(char_array,"\n"); printf("\nEnter a string:\n"); char string[100]; fgets(string,sizeof(string),stdin); printf("\nCharacter Array: %s\n", char_array); printf("String: %s\n", string); return 0; }
问题核心
在类Unix系统中,Ctrl+D会将标准输入流(stdin)标记为EOF状态。一旦流进入EOF状态,后续所有输入函数(如fgets)都会直接返回NULL,不会等待用户输入——这就是你程序直接跳过后续输入步骤的原因。此外原代码还有两处错误:
- 用
char_array[i-1] == EOF判断EOF是错误的:EOF是整型值(通常为-1),char类型无法正确存储或比较该值; - 循环结束后直接修改
char_array[i-1]存在越界风险,当i=0时会访问数组负索引。
修正后的代码
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char char_array[100]; int i = 0; printf("Enter characters (press CTRL+D to end):\n"); // 逐个读取字符,避免fgets的EOF流状态锁定问题 while (i < sizeof(char_array) - 1) { int c = getchar(); if (c == EOF) { break; } char_array[i++] = (char)c; } // 确保字符串以'\0'结尾,避免乱码 char_array[i] = '\0'; // 关键:清除stdin的EOF状态标志,让后续输入函数正常工作 clearerr(stdin); printf("\nEnter a string:\n"); char string[100]; fgets(string, sizeof(string), stdin); // 去掉fgets读取到的换行符,优化输出格式 string[strcspn(string, "\n")] = '\0'; printf("\nCharacter Array: %s\n", char_array); printf("String: %s\n", string); return 0; }
关键修改说明
- 改用
getchar()读取:逐个字符读取更易控制,能直接判断EOF,避免fgets一次性读取导致的流状态锁定; - 调用
clearerr(stdin):强制重置stdin的EOF错误标志,让后续的fgets能重新等待用户输入; - 安全处理字符串结尾:直接在数组有效索引范围内设置
'\0',避免越界; - 清除换行符:用
strcspn去掉fgets自动读取的换行符,让输出更整洁。
内容的提问来源于stack exchange,提问作者petyr
相关产品推荐
相关产品推荐

