如何打印无效的字母

时间:2018-12-27 14:32:03

标签: c printf

当有人输入大写或小写字母时,如何打印无效的字符,因为据说他们只能输入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:");
    }
}

3 个答案:

答案 0 :(得分:2)

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

此外,该表达式没有意义:

judge1=a>96

>的优先级高于==,因此它等效于:

judge1=(a>96)

假设为a分配了一个值,a>96将该值与96进行比较,并得出0或1。然后将此值分配给judge1,覆盖从==中读取的内容。用户。假设您打算使用judge1==0,这也没有道理。在这种情况下,judge1==1a>96的评估取决于judge1的结果。因此,仅当a为1且judge1大于96或a为0且a小于或等于96时,以上表达式才成立。 >

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

您要执行的操作是使用strtof读取一行文本,然后使用float读取strtoffgets函数接受指针的地址作为第二个参数,以使您知道解析在字符串中的何处停止。因此,如果该指针没有指向字符串末尾的空终止符(或指向换行符,因为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); 读取并存储了换行符),那么您就知道您读取了一个非浮点字符。

document.addEventListener('DOMContentLoaded', function(e) {
    document.querySelectorAll('[type="range"]').forEach(function (ele) {
        ele.addEventListener('input', function (e) {
            this.parentElement.querySelector('span').textContent = this.value;
            var next = this.closest('div').nextElementSibling;
            if (next.tagName != 'DIV') {
                next = this.closest('div').previousElementSibling;
            }
            next.querySelector('[type="range"]').value = 100 - +this.value;
            next.querySelector('span').textContent = 100 - +this.value;
        });
        // start with an initial value.....simultating an input...
        ele.parentElement.querySelector('span').textContent = ele.value;
    });
})

答案 1 :(得分:1)

首先,检查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");

答案 2 :(得分:0)

问题是您的坏角色陷入了困境。解决方案在这里: scanf fails why?。 John Bode建议执行的操作是使用getchar将其取出。还要应用建议的检查记录,它应该可以工作。

它什么也没提供,只是与更大的画面弄混了。