You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何按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;
}

关键修改说明

  1. 改用getchar()读取:逐个字符读取更易控制,能直接判断EOF,避免fgets一次性读取导致的流状态锁定;
  2. 调用clearerr(stdin):强制重置stdin的EOF错误标志,让后续的fgets能重新等待用户输入;
  3. 安全处理字符串结尾:直接在数组有效索引范围内设置'\0',避免越界;
  4. 清除换行符:用strcspn去掉fgets自动读取的换行符,让输出更整洁。

内容的提问来源于stack exchange,提问作者petyr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 18:06:05