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

