C 为什么我的代码只计算字符串中小写字母的频率

C 为什么我的代码只计算字符串中小写字母的频率,c,char,character,logical-operators,C,Char,Character,Logical Operators,我正在开发一个计算字符串中字符数的程序。它还统计并报告每个字母a-z的使用次数。由于某些原因,我无法理解我的程序将只计算并返回小写字母 #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char string[100]; int c = 0, count[26] = {0}, x, charcount = 0; printf("Enter

我正在开发一个计算字符串中字符数的程序。它还统计并报告每个字母a-z的使用次数。由于某些原因,我无法理解我的程序将只计算并返回小写字母

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


int main()
{
    char string[100];
    int c = 0, count[26] = {0}, x, charcount = 0;

    printf("Enter a string\n");
    gets(string);


    while (string[c] != '\0')
    {
        if (string[c] >= 'a'||'A' && string[c] <= 'z'||'Z')
        {
            x = string[c] - 'a';
            count[x]++;
        }
        c++;
    }
    for(c = 0; c < strlen(string); c++)
    {
        if(string[c] !=' ')
        {
            charcount++;

        }
    }
    printf("The string %s is %d characters long.\n", string, charcount);


    for (c = 0; c < 26; c++)
    {
        if(count[c] != 0)
            printf("%c %d \n", c + 'A', count[c]);


    }



    return 0;
}

有人知道我做错了什么吗?

这行代码严重损坏:

if (string[c] >= 'a'||'A' && string[c] <= 'z'||'Z')
如果应该:

if ( ((string[c] >= 'a') && (string[c] <= 'z')) || ((string[c] >= 'A') && (string[c] <= 'Z'))
但整个混乱局面可以用以下方式来取代:

#include <ctype.h>
....
if (isalpha(string[c]))

这一行代码被严重破坏:

if (string[c] >= 'a'||'A' && string[c] <= 'z'||'Z')
如果应该:

if ( ((string[c] >= 'a') && (string[c] <= 'z')) || ((string[c] >= 'A') && (string[c] <= 'Z'))
但整个混乱局面可以用以下方式来取代:

#include <ctype.h>
....
if (isalpha(string[c]))
这:

或者更好,只需使用ctype.h库中的isalpha函数来验证字符是否为字母:

#include <ctype.h>

//...

if (isalpha(string[c]))
在减去“a”之前,您需要将字母转换为小写,因此我们可以再次使用tolower:

这:

或者更好,只需使用ctype.h库中的isalpha函数来验证字符是否为字母:

#include <ctype.h>

//...

if (isalpha(string[c]))
在减去“a”之前,您需要将字母转换为小写,因此我们可以再次使用tolower:


我看到x=string[c]-“a”表示小写;大写字母的处理在哪里?string[c]>='a'| |'a'&&string[c]这能回答您的问题吗?您希望在ctypes.h中使用isalpha函数。您测试字符串[c]的逻辑完全错误。另请参阅isupper、islower和isspace。您知道,这是一种非常方便的方法,可以收集所有类型的字符(大写、小写、数字、空格、标点符号、控件等)的计数。。。只需为要计数的每个类别的字符创建一个频率数组。只需创建并初始化数组(全部为零),然后使用一个索引将字符映射到数组的一个元素,例如,如果isupperc upper[c-'A']++;依此类推。我看到x=string[c]-“a”表示小写;大写字母的处理在哪里?string[c]>='a'| |'a'&&string[c]这能回答您的问题吗?您希望在ctypes.h中使用isalpha函数。您测试字符串[c]的逻辑完全错误。另请参阅isupper、islower和isspace。您知道,这是一种非常方便的方法,可以收集所有类型的字符(大写、小写、数字、空格、标点符号、控件等)的计数。。。只需为要计数的每个类别的字符创建一个频率数组。只需创建并初始化数组(全部为零),然后使用一个索引将字符映射到数组的一个元素,例如,如果isupperc upper[c-'A']++;等等
x = tolower(string[c]) - 'a';