C语言 字母计数器函数中的分段错误

djp7away  于 2023-01-20  发布在  其他
关注(0)|答案(2)|浏览(133)

我正在写一个C程序,它应该接受一个字符数组,然后计算其中所有的小写字母,所有的大写字母以及所有的元音字母。但是由于某种原因,它没有运行,因为编译器返回了一个分段错误。我不知道它是什么,也不知道问题出在哪里

#include <stdio.h>
int lccount(char x[10]){
    int count=0,i,j;
    char lowalphabet[]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
    for(i=0;i<=10;i++){
        for(j=0;j<=26;j++){
            if(x[i]==lowalphabet[j]){
                count++;
            }
        }
    }
return count;}
int uccount(char x[10]){
    int count=0,i,j;
    char upalphabet[]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
    for(i=0;i<=10;i++){
        for(j=0;j<=26;j++){
            if(x[i]==upalphabet[j]){
                count++;
            }
        }
    }
return count;}
int vcount(char x[10]){
    int count=0,i,j;
    char vowels[]={'a','e','i','o','u','A','E','I','O','U'};
    for(i=0;i<=20;i++){
        for(j=0;j<=10;j++){
            if(x[i]==vowels[j]){
                count++;
            }
        }
    }
return count;
}
void main(){
    char x[10]={'a','W','E','R','s','d','a','e','i','A'};
    int v,uc,lc;
    v=vcount(x[]);
    uc=uccount(x[]);
    lc=lccount(x[]);
    printf("%d vowels\n%d uppercase\n%dlowercase",v,uc,lc);
}

结果=〉分割故障

cgh8pdjw

cgh8pdjw1#

首先,您的main()签名是非标准的;其次,您只将数组作为参数与其标识符一起传递。

int main(int argc, char *argv[])
{
    char x[10]={'a','W','E','R','s','d','a','e','i','A'};
    int v,uc,lc;
    v=vcount(x);
    uc=uccount(x);
    lc=lccount(x);
    printf("%d vowels\n%d uppercase\n%dlowercase",v,uc,lc);
    return 0;
}

请记住,您的代码中还有许多其他问题。例如,它显示小写8,而实际上有6。检查其他人在您的问题中发布的关于循环的评论,作为修复它的提示。

sg3maiej

sg3maiej2#

正如其他人在注解中指出的,你的代码有一个缓冲区溢出,C中的数组从0开始索引,这意味着,如果你有一个26个字符的数组,第一个字符在0,第二个在1,......,第i个在i-1,第26个在25

for (int i = 0; i < 25; ++i)
    ...

你不能把一个字符串传递给一个[]的函数。
此外,您的main()声明不正确。它应该是以下之一:

  1. int main(int argc, const char *argv[])(如果从命令行使用参数),或
    1.否则为int main(void)
    您可以做几件事来改进您的代码:
  • 如果将第i个字符与其ASCII代码进行比较,则可以避免分配char数组和嵌套的for循环。
  • 可以将要处理的数组/字符串的大小作为函数参数传递。
  • 当您不修改数据时,请始终使用const
int lccount(const size_t size, const char x[size])
{
    int count = 0;

    for (size_t i = 0; i < size; ++i)
        if (x[i] >= 'a' && x[i] <= 'z')
            ++count;
    
    return count;
}

int uccount(const size_t size, const char x[size])
{
    int count = 0;

    for (size_t i = 0; i < size; ++i)
        if (x[i] >= 'A' && x[i] <= 'Z')
            ++count;
    
    return count;
}

int vcount(const size_t size, const char x[size])
{
    int count = 0;
    for (size_t i = 0; i < size; ++i)
        switch (x[i]) {
        case 'a': case 'A':
        case 'e': case 'E':
        case 'i': case 'I':
        case 'o': case 'O':
        case 'u': case 'U':
            ++count;
            break;
        default: continue;
        }
    
    return count;
}

int main(void) // Since you don't use argc and argv
{
    char x[10] = {'a', 'W', 'E', 'R', 's', 'd', 'a', 'e', 'i', 'A'};
    const size_t size = sizeof(x) / sizeof(x[0]);

    int v = vcount(size, x);
    int uc = uccount(size, x);
    int lc = lccount(size, x);

    printf("%d vowels\n%d uppercase\n%d lowercase",v, uc, lc);
}

结果:

6 vowels
4 uppercase
6 lowercase

相关问题