程序只执行'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();
}
}发布于 2018-05-06 20:11:33
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请注意,通常在最后一个字符后有一个空的结束符。
如您所见,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);发布于 2018-05-06 19:13:09
x=strlen(cMessage)后的cMessage[x]始终为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++;
}对于64位平台上的size_t类型,%d格式不正确。请阅读:How can one print a size_t variable portably using the printf family?
发布于 2018-05-06 19:15:25
取x作为字符串的长度。所以这比你的数组长了一个。在完整的数组之后,始终是0来表示程序,该数组不会更长。这样你就永远不能进入if's
https://stackoverflow.com/questions/50198971
复制相似问题