为什么使用 getchar() 获取输入会陷入无限循环?
Why taking input with getchar() falls in infinite loop?
代码:
#include <stdio.h>
int main()
{
char ch;
do
{
printf("Enter first letter? ");
ch=getchar();
//scanf("%c", &ch);
}
while(ch!='A' || ch!='S' || ch!='M' || ch!='D');
printf("\n terminate here");
return 0;
}
输出:
Runtime error time: 0 memory: 2160 signal:25
Enter first letter? Enter first letter? Enter first letter? Enter first letter? Enter first letter? Enter first letter? Enter first letter? Enter first letter? Enter first letter? Enter first letter? Enter first letter? Enter first letter? Enter first letter? Enter first letter? Enter first letter? Enter first letter? Enter first letter? Enter first letter? Enter first letter?
我尝试了所有可能的方法,但没有成功。 scanf()
也不起作用。代码有什么问题?
你的循环条件在逻辑上总是为真。您只接受一个字符,但当输入的字符不同于以下任何字符时您的条件为真:'A'、'S'、'M'、'D'。你需要更正这个:
#include <stdio.h>
int main()
{
char ch;
do
{
printf("Enter first letter? ");
ch = getchar();
//scanf("%c", &ch);
} while (ch != 'A' && ch != 'S' && ch != 'M' && ch != 'D');
printf("\n terminate here");
return 0;
}
假设,你给了A
作为输入,那么第一个条件不满足,但是其他条件都满足了。 S
、M
和 O
也是如此。
在我看来,当您收到上述四个字母之一时,您正试图停止 while 循环。它可以通过多种方式完成,例如 ch!='A' && ch!='S' &&ch!='M' && ch!='D'
或 !(ch!='A' || ch!='S' ||ch!='M' ||ch!='D')
.
我在代码中使用了第二个,因为您的代码几乎不需要更改。
#include <stdio.h>
int main()
{
char ch;
do
{
printf("Enter first letter? ");
ch=getchar();
getchar(); // extra getchar
//scanf("%c", &ch);
}
while(!(ch!='A' || ch!='S' ||ch!='M' ||ch!='D'));
printf("\n terminate here");
return 0;
}
N.B.
你必须给一个额外的 getchar()
因为输入一个字母后你会给出回车按钮。第二个 getchar()
是为了采用这条新线(\n
)并忽略。如果将来自第二个 getchar()
的输入分配到变量中并打印 ASCII 字符,您会发现 \n
.
的相同值
do-while
语句总是正确的。
- 于是进入死循环
原因如果 ch != 'A'
为假且条件为真,如果 ch!='A'
为真则循环为真无论哪种方式为真。
解决方案:使用和逻辑即代替 ||
使用 &&
.
代码:
#include <stdio.h>
int main()
{
char ch;
do
{
printf("Enter first letter? ");
ch=getchar();
//scanf("%c", &ch);
}
while(ch!='A' || ch!='S' || ch!='M' || ch!='D');
printf("\n terminate here");
return 0;
}
输出:
Runtime error time: 0 memory: 2160 signal:25
Enter first letter? Enter first letter? Enter first letter? Enter first letter? Enter first letter? Enter first letter? Enter first letter? Enter first letter? Enter first letter? Enter first letter? Enter first letter? Enter first letter? Enter first letter? Enter first letter? Enter first letter? Enter first letter? Enter first letter? Enter first letter? Enter first letter?
我尝试了所有可能的方法,但没有成功。 scanf()
也不起作用。代码有什么问题?
你的循环条件在逻辑上总是为真。您只接受一个字符,但当输入的字符不同于以下任何字符时您的条件为真:'A'、'S'、'M'、'D'。你需要更正这个:
#include <stdio.h>
int main()
{
char ch;
do
{
printf("Enter first letter? ");
ch = getchar();
//scanf("%c", &ch);
} while (ch != 'A' && ch != 'S' && ch != 'M' && ch != 'D');
printf("\n terminate here");
return 0;
}
假设,你给了A
作为输入,那么第一个条件不满足,但是其他条件都满足了。 S
、M
和 O
也是如此。
在我看来,当您收到上述四个字母之一时,您正试图停止 while 循环。它可以通过多种方式完成,例如 ch!='A' && ch!='S' &&ch!='M' && ch!='D'
或 !(ch!='A' || ch!='S' ||ch!='M' ||ch!='D')
.
我在代码中使用了第二个,因为您的代码几乎不需要更改。
#include <stdio.h>
int main()
{
char ch;
do
{
printf("Enter first letter? ");
ch=getchar();
getchar(); // extra getchar
//scanf("%c", &ch);
}
while(!(ch!='A' || ch!='S' ||ch!='M' ||ch!='D'));
printf("\n terminate here");
return 0;
}
N.B.
你必须给一个额外的 getchar()
因为输入一个字母后你会给出回车按钮。第二个 getchar()
是为了采用这条新线(\n
)并忽略。如果将来自第二个 getchar()
的输入分配到变量中并打印 ASCII 字符,您会发现 \n
.
do-while
语句总是正确的。- 于是进入死循环
原因如果 ch != 'A'
为假且条件为真,如果 ch!='A'
为真则循环为真无论哪种方式为真。
解决方案:使用和逻辑即代替 ||
使用 &&
.