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

为什么C语言while循环内的scanf函数仅会执行一次?

问题修复方案

根因说明

  • scanf格式串逻辑错误:你使用的%[^\n]s存在两处问题:
    1. %[^\n]是独立的格式匹配符,末尾多余的s不属于规则内容,会导致匹配完字符串后尝试匹配输入流中的s字符,匹配失败即终止读取
    2. %[^\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;
}

核心修复点

  1. 调整scanf格式串为%999[^\n],删除多余的s,同时限制读取长度避免缓冲区溢出
  2. 每次读取完成后调用getchar()消耗输入缓冲区残留的换行符,保证下一轮循环可以正常读取下一行内容
  3. 补充<string.h>头文件,将strlen计算提到循环外减少重复运算

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 08:06:02