该程序仅执行“strlen”功能。

这个while循环中的if语句甚至无法工作...

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

main()
{
    char cMessage[100];
    int cLow = 0, cUp = 0, cSpec = 0, cSpace = 0, cNum = 0;
    printf("Enter your message: ");
    scanf("%s", cMessage);
    int x = 0;

    while(cMessage[x] != 0)
    {
        x = strlen(cMessage);
        printf("Total characters: %d", x);

        if(islower(cMessage[x]))
        {
            printf("\nTotal Lowercase Letters: %d", cLow);
            cLow++;
        }
        else if(isupper(cMessage[x]))
        {
            printf("\nTotal Uppercase Letters: %d", cUp);
            cUp++;
        }
        else if(isalnum(cMessage[x]))
        {
            printf("\nTotal Special Characters: %d", cSpec);
            cSpec++;
        }
        else if(isspace(cMessage[x]))
        {
            printf("\nTotal Lowercase Letters: %d", cSpace);
            cSpace++;
        }
        else if(isdigit(cMessage[x]))
        {
            printf("\nTotal Lowercase Letters: %d", cNum);
            cNum++;
        }
    }
    x++;
}

我无法弄清楚这个问题的原因...

这可能是什么原因?

编辑:所以这是程序的修改后的代码,我现在唯一的问题是没有计算空格。顺便说一句,是否有用于“计数”特殊字符的特定功能?我使用过“isalnum”,但我意识到这是错误的
#include<stdio.h>
#include<string.h>
#include <ctype.h>
#include<conio.h>

main(){
char cMessage[100];
int cLow=0, cUp=0, cSpec=0, cSpace=0, cNum=0;

printf("Enter your message: ");
scanf("%s", cMessage);
int x=0;
while(cMessage[x]){

printf("Total characters: %d", strlen(cMessage));
while(cMessage[x]!=0){
if(islower(cMessage[x])){ cLow++;}

if(isupper(cMessage[x])){ cUp++;}

if(isalnum(cMessage[x])){ cSpec++; }

if(isspace(cMessage[x])){ cSpace++; }

if(isdigit(cMessage[x])){ cNum++; }
x++;
}
printf("\nTotal Lowercase Letters: %d", cLow);
printf("\nTotal Uppercase Letters: %d", cUp);
printf("\nTotal Special Characters: %d", cSpec);
printf("\nTotal Spaces: %d", cSpace);
printf("\nTotal Numbers: %d", cNum);
getch();
   }
}

最佳答案

x = strlen(cMessage);将为您提供cMessage的长度,该长度始终是最后一项的索引+ 1。

例如,如果:cMessage = "The"x = strlen(cMessage),则:

x = 3
cMessage[0] = 'T'
cMessage[1] = 'h'
cMessage[2] = 'e'
cMessage[3] = NULL terminator // equivalence to 0

请注意,最后一个字符后通常会有一个NULL终止符。

如您所见,while条件始终是第一遍之后的false

尝试使用单独的变量遍历cMessage

另外,您还需要考虑放置诸如cUp++' before the 'printf语句之类的变量。

一个更优雅的替代方法是使用for语句代替while

还要注意isalnum(cMessage[x])会干扰if(isdigit(cMessage[x])),因此,最好使用单独的if语句和git摆脱else if,此外,如果要计算特殊字符,则必须将isalnum取反为:if(!isalnum(cMessage[x]))

最后,您的输入将不接受句子(单词之间带有空格),因此您必须考虑替换:
scanf("%s", cMessage);


scanf("%[^\n]s",&cMessage);

关于c - 如果语句在while循环中不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50198971/

10-13 00:06