如果语句在循环中不起作用

时间:2018-05-06 11:06:07

标签: c strlen

程序只执行'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();
   }
}

3 个答案:

答案 0 :(得分:3)

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);

答案 1 :(得分:2)

cMessage[x]始终为0之后

x=strlen(cMessage)字符串包含从0x - 1的字符,在x后的字符为0.因此任何if条件是假的。

我认为x=strlen(cMessage);不是必需的,必须删除,x++必须是循环体中的最后一个运算符,因为你想要计算不同种类的字符。

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

%d不是64位平台上size_t类型的正确格式。阅读:How can one print a size_t variable portably using the printf family?

答案 2 :(得分:2)

你把x作为你的字符串的长度。所以这比你的数组长一个。在完整数组始终为0以显示程序后,数组不再存在。这样你就永远不会进入if