为什么C语言while循环内的scanf函数仅会执行一次?
问题修复方案
根因说明
scanf格式串逻辑错误:你使用的%[^\n]s存在两处问题:%[^\n]是独立的格式匹配符,末尾多余的s不属于规则内容,会导致匹配完字符串后尝试匹配输入流中的s字符,匹配失败即终止读取%[^\n]仅会读取换行符之前的内容,不会消耗输入缓冲区末尾的换行符,第二次进入循环时,输入流首字符就是换行符,%[^\n]匹配失败直接返回0,导致循环终止
- 头文件缺失:代码调用了
strlen函数,但未包含<string.h>头文件,可能触发未定义行为 - 存在缓冲区溢出风险:当前
scanf未限制读取长度,输入超过数组容量时会发生内存越界,不符合最长1000字符的业务要求
修复后代码
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char s[9999]; // 格式串限制最多读999个字符,删除多余的s while(scanf("%999[^\n]", s) > 0) { // 吃掉缓冲区残留的换行符 getchar(); int count=0, prev=0; int len = strlen(s); for (int i=0; i<len; i++) { if(s[i] == ' ') { count = i - prev; prev = i + 1; printf("%c", (char)(96 + count)); } else if(i == len - 1) { count = i - prev + 1; printf("%c", (char)(96 + count)); } } printf(" "); } return 0; }
核心修复点
- 调整
scanf格式串为%999[^\n],删除多余的s,同时限制读取长度避免缓冲区溢出 - 每次读取完成后调用
getchar()消耗输入缓冲区残留的换行符,保证下一轮循环可以正常读取下一行内容 - 补充
<string.h>头文件,将strlen计算提到循环外减少重复运算
内容的提问来源于stack exchange,提问作者Spark
相关产品推荐
相关产品推荐

