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
相关产品推荐
相关产品推荐

