【问题标题】:How do I print Invalid for letters如何打印无效的字母
【发布时间】:2025-11-25 13:40:01
【问题描述】:

当有人输入大写或小写字母时,我如何打印无效,因为据说他们只输入 0 到 10 之间的浮点数。

我尝试过这样的编码

事情大错特错了。

#include<stdio.h>


int main()
{
    int trial=0;
    float judge1=0,judge2,judge3,judge4,judge5;
    char a;

    printf("\n%90s","Welcome to the constentant score calculator program :)");

    printf("\n\n\n\n\n\rKindly enter the constentant score by 5 respected 
 judges:");

    do
    {
        printf("\n\nScore by JUDGE 1 (0-10):\t");
        scanf("%f",&judge1);

         if ((judge1>-1)&& (judge1<11) )
             printf("The constentant got %.2f from the judge",judge1);
         else
            printf("\aPlease input a valid score between 0 and 10:");
     } while ((judge1<0) || (judge1>10)||(judge1=a>96) && (judge1=a<123)|| 
 (judge1=a<91) && (judge1=a>64));
}

好的,这是我的第二个代码

#include<stdio.h>

int main()
{
    float judge1;

    printf("\n%90s","Welcome to the constentant score calculator program :)");

    printf("\n\n\n\n\n\rKindly enter the constentant score by 5 respected 
judges:");

    printf("\n\nScore by JUDGE 1 (0-10):\t");
    scanf("%f",&judge1);

    if ((judge1>-1) && (judge1<11))
      printf("The constentant got %.2f from the judge",judge1);
    else
        printf("\aPlease input a valid score between 0 and 10:");
    }
}

【问题讨论】:

  • char1 的值是什么?
  • char1 没有价值......我在插入字母@ThiruShetty 时使用它打印无效
  • @P__J__: judge1==char1&gt;96 不总是零,judge1==char1&lt;123 也不总是 1。如果 judge1 是 1,char1'|',那么 judge1==char1&gt;96 是 1 和 @ 987654330@ 为 0。
  • @P__J__ 是的,我希望它以这种方式工作,所以如果他们插入字母,它将打印“请输入 0 到 10 之间的有效分数:”);”,但不幸的是它不起作用那样。
  • @ThiruShetty char1 值取决于字母,使用 ASCII 码。

标签: c printf


【解决方案1】:

当您使用"%f" 作为scanf 的格式字符串时,它将只读取对浮点类型有效的字符,如果检测到任何其他字符,它将停止读取。因此,如果有人键入“abc”,nothing 会写入judge1,并且这些字符会留在输入缓冲区中以供再次读取。然后,您将陷入读取这些相同字符的无限循环。

另外,这个表达式没有意义:

judge1=a>96

&gt; 的优先级高于==,所以相当于:

judge1=(a>96)

假设为a 分配了一个值,a&gt;96 将该值与 96 进行比较并计算为 0 或 1。然后将此值分配给 judge1,覆盖从用户那里读取的内容。假设您打算使用 == 这也没有意义。在这种情况下,根据a&gt;96 的结果评估judge1==0judge1==1。所以上面的表达式只有在judge1为1且a大于96或judge1为0且a小于或等于96时才成立。

另一个问题是a 从未被赋值。您似乎认为当您调用scanf("%f",&amp;judge1); 时,读取的第一个字符将写入a。没有导致这种情况发生的链接,因此 a 未初始化。

您想要做的是使用fgets 读取一行文本,然后使用strtof 读取floatstrtof 函数接受一个指针的地址作为第二个参数,让您知道解析停止在字符串中的哪个位置。因此,如果该指针不指向字符串末尾的空终止符(或不指向换行符,因为fgets 读取并存储换行符),那么您就知道您读取的是非浮点字符。

float judge1;
char line[100];
char *p;
int invalid_input;

do {
    invalid_input = 0;
    fgets(line, sizeof(line), stdin);
    errno = 0;
    judge1 = strtof(line, &p);
    if (errno || ((*p != 0) && (*p != '\n')) || (judge1 < 0) || (judge1 > 10)) {
        printf("Please input a valid score between 0 and 10:");
        invalid_input = 1;
    } else {
        printf("The constentant got %.2f from the judge\n ",judge1);
    }
} while (invalid_input);

【讨论】:

  • 作为 C 的初学者,很抱歉,我无法真正理解你的每一个意思:(,所以,你能帮我编辑我的代码,这样当用户输入一个字母时,它会打印“请输入有效的输入”而不是“常数分数为 0.00”或无限循环....我真的不明白。
  • @AathfAddli 我的答案中的代码可以满足您的需要。仔细阅读所有内容。
  • 你介意看看我的第二个代码吗?我编辑了我的帖子,所以第二个代码的问题是,为什么当我输入字母“k”作为输入时,它显示“The参赛者从评委那里得到0.00分?不应该显示“请输入0到10之间的vlid输入”吗?
  • @AathfAddli 和第一段代码有同样的问题,如本答案第一段所述,并在答案中的代码中解决。
  • 所以可以说,参考你的第一段,如果我使用 %f,并且输入的输入是 abc,我将永远进入无限循环,因为它不会读对吗?
【解决方案2】:

首先,检查scanf的返回值。如果它无法匹配项目,它将返回0。然后你可以检查输入的数字是否在范围内:

int r, judge1;
...
r = scanf("%d", &judge1);
if(r != 1)
{
    printf("invalid input\n");
    while((r = fgetc(stdin)) != EOF && r != '\n');
}
else if((judge1 < 0) || (judge1 > 10))
    printf("input out of range\n");
else
    printf("valid input\n");

【讨论】:

  • 他甚至需要检查 ASCII 字符
  • 是的,这段代码可以正常工作,但这不是我要找的答案,我的问题是输入字母时,例如 k,它会打印“常数分数为 0.00”,由查看我的代码,它应该显示“请输入 0 到 10 之间的有效输入”,你去,我编辑了我的代码....请帮助
  • @AathfAddli 你错了,如果你按照 mnistic 做了什么,它会做你所期望的。
  • @mnistic 您必须将 scanf 的结果与 1 进行比较以管理所有错误情况
  • @bruno 我明白了,但这意味着 if(!r)
【解决方案3】:

问题是你有坏字符卡在流中。解决方案在这里: scanf fails why?。 John Bode 建议做的事情是使用 getchar 将其取出。还应用建议的检查 mnistic,它应该可以工作。

它没有提供任何东西,它只会与更大的画面相混淆。

【讨论】:

    最近更新 更多