Если операторы не работают внутри цикла while - PullRequest
0 голосов
/ 06 мая 2018

Программа выполняет только функцию 'strlen'.

Операторы if внутри этого цикла while даже не работают ...

#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 голосов
/ 06 мая 2018

В качестве длины строки вы берете x. Так что это на один дольше, чем ваш массив. После полного массива всегда 0, чтобы показать программе, массив не длиннее. Таким образом, вы никогда не сможете перейти в if's

0 голосов
/ 06 мая 2018

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);
0 голосов
/ 06 мая 2018

cMessage[x] после x=strlen(cMessage) всегда равно 0. Строка содержит символы от 0 до x - 1, символ в столбце x равен 0. Таким образом, любое условие if ложно.

Полагаю, x=strlen(cMessage); не требуется и должен быть удален, x++ должно быть тремя последними операторами в теле цикла, поскольку вы хотите считать символы разных типов.

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

%d - неправильный формат для типа size_t на 64-битной платформе. Прочитайте это: Как можно распечатать переменную size_t с помощью семейства printf?

...