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

C语言字符串校验问题:判断全大写无空格时ver变量异常

问题分析与修复

你的代码里有几个关键问题导致ver变量异常累加:

  • 连续比较语法错误:C语言不支持'a'<=ch[x]<='z'这种连续比较写法。这个表达式会先计算'a'<=ch[x],得到0或1的布尔值,再拿这个值和'z'比较,结果永远为真(因为1<=122)。所以只要字符不是空格,这个分支就会触发,ver就会被加1,哪怕是大写字母也会中招。正确写法应该是ch[x] >= 'a' && ch[x] <= 'z'。

  • ver未重置:每次输入新字符串前,ver没有被重置为0,上一次循环的ver值会被保留,导致后续判断彻底混乱。

  • 内层循环死循环风险:当字符是大写字母时,进入else分支后x没有递减,会导致内层do-while循环一直卡在同一个x值,直接陷入死循环。

  • gets函数不安全:gets已经被C标准废弃,它不检查输入长度,容易导致缓冲区溢出,建议用fgets替代,同时要处理fgets读取到的换行符。


修正后的代码
#include<stdio.h>
#include<string.h>

int main(){
    char ch[200];
    int ver;
    do {
        ver = 0; // 每次输入前重置ver
        printf("Donner un chaine : ");  
        // 用fgets替代gets,处理换行符
        fgets(ch, sizeof(ch), stdin);
        // 去掉fgets读取的换行符
        size_t len = strlen(ch);
        if (len > 0 && ch[len-1] == '\n') {
            ch[len-1] = '\0';
        }
        int x = strlen(ch) - 1;
        while(x > -1){ // 改用while更直观
            printf("ch[x]=%c\t",ch[x]);
            printf("x=%d\t",x);
            printf("ver=%d\n",ver);         
            if (ch[x] == ' '){
                ver += 1;
            }
            else if(ch[x] >= 'a' && ch[x] <= 'z'){
                ver += 1;
            }
            // 无论哪个分支,x都要递减
            x -= 1;
        }
    }while(ver > 0);
    printf("输入的字符串符合要求:全大写且无空格\n");
    return 0;
}

关键修复点说明
  • 每次进入外层循环时,先把ver重置为0,确保每次判断都是基于当前输入的字符串。
  • 修正了小写字符的判断逻辑,用逻辑与&&实现正确的范围比较。
  • 内层循环中,不管字符是什么类型,都执行x -= 1,彻底避免死循环。
  • 替换gets为fgets,并处理换行符,提升代码的安全性和正确性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 14:50:31