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

C语言如何跳出fgets while循环 筛选含10个大写字母的字符串

问题解决方案

1. 循环无法终止的解决方法

fgets读取用户输入的空行时,会将换行符\n也读取到缓冲区中,此时strlen(c)的返回值为1而非0,因此不会触发你预想的终止逻辑。你只需要在while循环的开头加入空行判断即可:

while(fgets(c,20,stdin) != NULL){
    // 新增空行判断:输入为空直接退出循环
    if(c[0] == '\n'){
        break;
    }
    // 原有逻辑
}

如果需要通过EOF终止输入,Windows系统按Ctrl+Z、Linux/macOS系统按Ctrl+D即可触发fgets返回NULL退出循环。

2. 原有代码的其他逻辑错误修正

你的代码还存在多处逻辑问题会导致需求无法实现,需要同步修正:

  • 变量i未初始化就访问c[i],属于未定义行为,且ASCII值获取的位置错误,需要放到for循环内部每次读取当前下标对应的字符
  • 有效标记变量没有每轮循环重置,只要之前出现过有效行,后续所有行都会被误判为有效
  • result数组未初始化,strcat拼接时会把垃圾值也算作初始内容
  • 有效判断逻辑错误:当前逻辑只要字符串存在一个大写字母就判定为有效,不符合「10个字符全为大写字母」的要求
  • 计数和拼接逻辑写到了while循环外部,只会在所有输入结束后执行一次,无法统计所有有效行
  • 注意C语言中bool是<stdbool.h>定义的关键字,不建议直接作为变量名使用

3. 修正后的完整代码

#include <stdio.h>
#include <string.h>

int main(){
    char c[20], result[50] = {0}; // 初始化result为空字符串
    int count = 0, i;
    
    while(fgets(c,20,stdin) != NULL){
        // 空行直接退出循环
        if(c[0] == '\n'){
            break;
        }
        int stringSize = strlen(c);
        // 10个大写字母+换行符总长度为11
        if(stringSize == 11){
            int is_valid = 1; // 每轮重置有效标记
            for(i = 0; i < stringSize - 1; i++){ // 最后一位是换行符不用判断
                int ascii = c[i];
                // 只要有一个字符不是大写字母就标记为无效
                if(!(ascii >= 'A' && ascii <= 'Z')){
                    is_valid = 0;
                    break;
                }
            }
            if(is_valid){
                count++;
                strcat(result, c);
            }
        }
    }
    
    printf("有效字符串数量:%d\n", count);
    printf("所有有效字符串:\n%s", result);
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 00:06:08