我目前正在学习C语言,我有一个练习,要求输入20个字符,并显示('a','e','i','o','u')的数量。我编写了以下代码:
#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次。为什么会发生这种情况?警局。对不起,我的英语很差。
发布于 2015-08-24 23:47:10
正如注释中提到的,您正在处理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个字符来进一步了解它是如何工作的。例如,如果我提供了21个字符的输入aaaaaeeeeeiiiiiooooo<RET>,您可以看到前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若要解决此问题,应读取并丢弃换行符,或者使用可忽略换行符的不同读取方法。
发布于 2015-08-24 23:48:00
您需要忽略换行符。
#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,它也能解决这个问题。
https://stackoverflow.com/questions/32185870
复制相似问题