C语言 如何使用指针检测字符串中的大小写字符

weylhg0b  于 2023-06-28  发布在  其他
关注(0)|答案(2)|浏览(88)

我是C的新手,最近开始学习指针。我试图输入一个字符串,然后获取字符串中的大小写字符数。我想在指针的帮助下做这件事。
这是我的代码:

#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);
    for (int *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:0 ,lowercase:0 ,others:3

如你所见,这是不正确的。有人能告诉我我做错了什么吗?

7vux5j2d

7vux5j2d1#

嗯,太像@Barmar了。保存为wiki,

关键错误:未在启用所有警告的情况下进行编译

将所有警告启用后,问题将被快速识别:

char s[20];
...
for (int *i = s; *i != '\0'; i++) {
warning: initialization of 'int *' from incompatible pointer type 'char *' [-Wincompatible-pointer-types]

保存时间,启用所有警告并使用一致的指针类型。

// for (int *i = s; *i != '\0'; i++) {
for (char *i = s; *i != '\0'; i++) {
vwkv1x7d

vwkv1x7d2#

不能使用int *指针访问字符串中的字符。当您取消引用指针时,它将读取多个字符(如果int是32位,则为4个字符),并且i++将递增多个字符。
您必须使用char *,因此将int *i更改为char *i
确保在编译器选项中启用了完整警告,并注意警告。当我试图编译你的代码时,我得到了这样的警告:

testuplow.c:9:14: warning: incompatible pointer types initializing 'int *' with an expression of type 'char[20]' [-Wincompatible-pointer-types]
    for(int *i=s;*i!='\0';i++)
             ^ ~

相关问题