首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >If语句在while循环中不起作用

If语句在while循环中不起作用
EN

Stack Overflow用户
提问于 2018-05-06 19:06:07
回答 3查看 5.3K关注 0票数 2

程序只执行'strlen‘函数。

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

代码语言:javascript
复制
#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‘,我意识到它是错误的

代码语言:javascript
复制
#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();
   }
}
EN

回答 3

Stack Overflow用户

发布于 2018-05-06 20:11:33

x = strlen(cMessage);将给出cMessage的长度,它始终是最后一项的索引+ 1。

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

代码语言:javascript
复制
x = 3
cMessage[0] = 'T'
cMessage[1] = 'h'
cMessage[2] = 'e'
cMessage[3] = NULL terminator // equivalence to 0

请注意,通常在最后一个字符后有一个空的结束符。

如您所见,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]))

最后,您的输入将不接受句子(中间有空格的单词),因此您必须考虑替换:

代码语言:javascript
复制
scanf("%s", cMessage);

使用

代码语言:javascript
复制
scanf("%[^\n]s",&cMessage);
票数 3
EN

Stack Overflow用户

发布于 2018-05-06 19:13:09

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

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

代码语言:javascript
复制
printf("Total characters: %zu", strlen(cMessage));
while(cMessage[x] != 0) {
    if(islower(cMessage[x])) {
    ...
    }
    x++;
}

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

票数 2
EN

Stack Overflow用户

发布于 2018-05-06 19:15:25

取x作为字符串的长度。所以这比你的数组长了一个。在完整的数组之后,始终是0来表示程序,该数组不会更长。这样你就永远不能进入if's

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50198971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档