程序只执行'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();
}
}
答案 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)
字符串包含从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
不是64位平台上size_t
类型的正确格式。阅读:How can one print a size_t variable portably using the printf family?
答案 2 :(得分:2)
你把x作为你的字符串的长度。所以这比你的数组长一个。在完整数组始终为0以显示程序后,数组不再存在。这样你就永远不会进入if
了