我目前正在学习C,我有一个练习,请求20个字符,并显示(' a'' e','我''○'' U&#39)。 我编码了这个:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main()
{
char letter;
int a = 0, e = 0, i = 0, o = 0, u = 0, x;
for(x = 0; x < 20; x++)
{
printf("\nEnter a character: ");
letter = getchar();
letter = tolower(letter);
switch(letter)
{
case 'a':
a += 1;
break;
case 'e':
e += 1;
break;
case 'i':
i += 1;
break;
case 'o':
o += 1;
break;
case 'u':
u += 1;
break;
default:
continue;
}
system("cls");
}
printf("\nAmount of 'a': %d", a);
printf("\nAmount of 'e': %d", e);
printf("\nAmount of 'i': %d", i);
printf("\nAmount of 'o': %d", o);
printf("\nAmount of 'u': %d\n", u);
system("pause");
return 0;
}
但这只能执行10次。为什么会这样? PD。抱歉我的英语很差。
答案 0 :(得分:1)
如评论中所述,您处理的是20个字符,但其中一半是换行符。如果你拿出你的专栏system("cls")
,那就显而易见了:
% ./ctest
Enter a character: a
Enter a character:
Enter a character: b
Enter a character:
Enter a character: c
在第一个提示符下,我键入了a<RET>
,第一个循环迭代(x=0
)处理了a
,但仍然有一个<RET>
在输入缓冲区中等待。第二个循环迭代(x=1
)获取下一个可用字符<RET>
并处理它,第三个循环迭代(x=2
)打印其提示并等待新输入。
您可以通过让它处理您正在计算的20个字符来进一步了解其工作原理。例如,如果我提供输入aaaaaeeeeeiiiiiooooo<RET>
,即21个字符,您可以看到前20个处理:
% ./ctest
Enter a character: aaaaaeeeeeiiiiiooooo
Enter a character:
Enter a character:
Enter a character:
Enter a character:
Enter a character:
Enter a character:
Enter a character:
Enter a character:
Enter a character:
Enter a character:
Enter a character:
Enter a character:
Enter a character:
Enter a character:
Enter a character:
Enter a character:
Enter a character:
Enter a character:
Enter a character:
Amount of 'a': 5
Amount of 'e': 5
Amount of 'i': 5
Amount of 'o': 5
Amount of 'u': 0
要解决此问题,您应该阅读并丢弃换行符或使用可忽略换行符的其他阅读方法。
答案 1 :(得分:1)
您需要忽略换行符。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main()
{
char letter;
int a = 0, e = 0, i = 0, o = 0, u = 0, x;
for (x = 0; x < 20; x++)
{
printf("\nEnter a character: ");
letter = getchar();
letter = tolower(letter);
if (letter == '\n')
{
x--;
system("cls");
continue;
}
if (letter)
{
switch (letter)
{
case 'a':
a += 1;
break;
case 'e':
e += 1;
break;
case 'i':
i += 1;
break;
case 'o':
o += 1;
break;
case 'u':
u += 1;
break;
default:
break;
}
}
system("cls");
}
printf("\nAmount of 'a': %d", a);
printf("\nAmount of 'e': %d", e);
printf("\nAmount of 'i': %d", i);
printf("\nAmount of 'o': %d", o);
printf("\nAmount of 'u': %d\n", u);
system("pause");
return 0;
}
您可以使用scanf代替getchar,它也可以解决它。