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

C语言新手:使用指针统计字符串大小写字符结果错误,求排查

问题分析与修复

你的代码核心错误是指针类型不匹配,导致字符串遍历逻辑完全错误,具体问题和修复方案如下:

1. 最关键的错误:指针类型错误

你在for循环里声明了int *i = s,但s是char类型的数组,正确的指针类型应该是char *。

  • 原因:int*指针的步长是4字节(32位系统),每次i++会跳过3个字符,导致你只读取了字符串中部分位置的4字节数据,而非单个字符的ASCII值。比如输入的QWerTy12,int*读取的是多个字符拼接的整数,永远不会匹配'A'-'Z'或'a'-'z'的范围,所以大写、小写计数都是0,循环执行次数也远少于实际字符数,最终others计数错误。
  • 修复:把int *i改成char *i,循环条件保持*i != '\0'即可正确遍历每个字符。

2. 次要问题:printf的换行符错误

代码里的printf(" %s", s);和printf(" uppercase:...");是错误写法,换行应该用转义字符\n,否则编译器可能报错或输出异常。修复为:

printf("\n%s", s);
// ...
printf("\n uppercase:%d ,lowercase:%d ,others:%d", cu, cl, cs);

修复后的完整代码

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

int main()
{ 
    char s[20];
    int cu = 0, cl = 0, cs = 0;
    scanf("%s", s);
    printf("\n%s", s);
    // 修正指针类型为char*
    for (char *i = s; *i != '\0'; i++)
    {
        if ((*i >= 'A') && (*i <= 'Z'))
            cu++;
        else if ((*i >= 'a') && (*i <= 'z'))
            cl++;
        else
            cs++;
    }
    printf("\n uppercase:%d ,lowercase:%d ,others:%d", cu, cl, cs);
}

测试结果

输入QWerTy12后,输出会变成:

QWerTy12
 uppercase:3 ,lowercase:3 ,others:2

这个结果是正确的(大写Q、W、T;小写e、r、y;数字1、2属于其他字符)。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 06:30:11