C If/else语句仅适用于整数。

C If/else语句仅适用于整数。,c,scanf,C,Scanf,它可以正常工作,直到您输入一个字符,然后它就变成了一个无限循环,而不仅仅是说“无效数字”。我不明白为什么。请帮忙 #include <stdio.h> int main (void) { int i = 0; int number; while (i == 0){ printf("Enter a number greater than 0 and smaller than 23.\n"); scanf (" %d", &number);

它可以正常工作,直到您输入一个字符,然后它就变成了一个无限循环,而不仅仅是说“无效数字”。我不明白为什么。请帮忙

#include <stdio.h>
int main (void)
{
int i = 0;
int number;
while (i == 0){
        printf("Enter a number greater than 0 and smaller than 23.\n");
        scanf (" %d", &number);
        if (number < 23 && number > 0 ){
            printf("Sucess!\n");
            break;
        } else {
            printf("Invalid number.\n");
}
}
}
#包括
内部主(空)
{
int i=0;
整数;
而(i==0){
printf(“输入一个大于0小于23的数字。\n”);
scanf(“%d”和编号);
如果(编号<23&&编号>0){
printf(“成功!\n”);
打破
}否则{
printf(“无效数字。\n”);
}
}
}

有几条建议可以改进您的代码:

  • 始终检查scanf中的返回值,它会告诉您有多少 已成功读取输入
  • 未处理的输入保留在输入缓冲区中,必须清除 出去
  • 未初始化的变量可能会误导您
  • 使用控制循环的
    i
    变量
经评论修正:

#include <stdio.h>

int main (void)
{
    int i = 0;
    int number = 0;                                 // an invalid value
    while (i == 0) {
        printf("Enter a number greater than 0 and smaller than 23.\n");
        if(scanf("%d", &number) == 1 && number < 23 && number > 0 ) {
            printf("Success!\n");
            i = 1;                                  // satisfy the loop control
        } else {
            printf("Invalid number.\n");
            while(getchar() != '\n');               // clear the input buffer
        }
    }
}
#包括
内部主(空)
{
int i=0;
int number=0;//一个无效值
而(i==0){
printf(“输入一个大于0小于23的数字。\n”);
如果(scanf(“%d”,&number)==1&&number<23&&number>0){
printf(“成功!\n”);
i=1;//满足循环控制
}否则{
printf(“无效数字。\n”);
while(getchar()!='\n');//清除输入缓冲区
}
}
}

有几条建议可以改进您的代码:

  • 始终检查scanf中的返回值,它会告诉您有多少 已成功读取输入
  • 未处理的输入保留在输入缓冲区中,必须清除 出去
  • 未初始化的变量可能会误导您
  • 使用控制循环的
    i
    变量
经评论修正:

#include <stdio.h>

int main (void)
{
    int i = 0;
    int number = 0;                                 // an invalid value
    while (i == 0) {
        printf("Enter a number greater than 0 and smaller than 23.\n");
        if(scanf("%d", &number) == 1 && number < 23 && number > 0 ) {
            printf("Success!\n");
            i = 1;                                  // satisfy the loop control
        } else {
            printf("Invalid number.\n");
            while(getchar() != '\n');               // clear the input buffer
        }
    }
}
#包括
内部主(空)
{
int i=0;
int number=0;//一个无效值
而(i==0){
printf(“输入一个大于0小于23的数字。\n”);
如果(scanf(“%d”,&number)==1&&number<23&&number>0){
printf(“成功!\n”);
i=1;//满足循环控制
}否则{
printf(“无效数字。\n”);
while(getchar()!='\n');//清除输入缓冲区
}
}
}

简单地说,输入的值超出了检查范围0到23。当输入一个字符时,会在int变量width中输入一些非常糟糕的值。为什么?因为scanf函数将输入作为十进制数,所以它读取的不仅仅是一个字符,内存中的任何内容都会被选为一个数字。我希望他的建议能有所帮助。
这是一个常见问题,请在此处查看scanf的用法:

简单地说,输入的值超出了选中的范围0到23。当输入一个字符时,会在int变量width中输入一些非常糟糕的值。为什么?因为scanf函数将输入作为十进制数,所以它读取的不仅仅是一个字符,内存中的任何内容都会被选为一个数字。我希望他的建议能有所帮助。
这是一个经常遇到的问题,请在此处查看scanf的用法:

为什么不向我们展示不起作用的代码?当使用
char
scanf
不使用不匹配的输入时,请不要让我们猜测您做了什么,因此字母会保留在输入上。检查
scanf
的返回值以查看是否成功。通过检查
scanf()
的返回值进行检查。旁白:
while(i==0)
无论如何是一个无限循环。@WeatherVane其中隐藏了一个
中断
为什么不向我们显示不起作用的代码?当使用
char
scanf
不使用不匹配的输入时,请不要让我们猜测您做了什么,因此字母会保留在输入上。检查
scanf
的返回值以查看是否成功。通过检查
scanf()
的返回值进行检查。旁白:
while(i==0)
无论如何都是一个无限循环。@WeatherVane在其中隐藏了一个
中断
,谢谢,但我怎么能“从
scanf
检查返回值?”?我真的不知道那是什么意思。我是在
if
条件下做的<如果有一个格式说明符成功转换了输入,则code>scanf将返回
1
。当您输入
“a”时,
将不会转换为
int
,因此
scanf
将返回
0
,并且
“a”
将保留在输入缓冲区中。这就是你的代码进入无限循环的原因——输入被不断拒绝。我想我现在明白了。谢谢,谢谢,但我怎么能呢“从
scanf
检查返回值?”?我真的不知道那是什么意思。我是在
if
条件下做的<如果有一个格式说明符成功转换了输入,则code>scanf将返回
1
。当您输入
'a'
时,它将不会转换为
int
,因此
scanf
将返回
0
,而
'a'
将保留在输入缓冲区中。这就是你的代码进入无限循环的原因——输入被不断拒绝。我想我现在明白了。谢谢