当有人输入大写或小写字母时,如何打印无效的字符,因为据说他们只能输入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:");
}
}
答案 0 :(得分:2)
将"%f"
用作scanf
的格式字符串时,它将仅读取对浮点类型有效的字符,并且如果检测到任何其他字符,将停止读取。因此,如果有人键入“ abc”,则什么都不写入judge1
,并且这些字符保留在输入缓冲区中以再次读取。然后,您将陷入读取这些相同字符的无限循环中。
此外,该表达式没有意义:
judge1=a>96
>
的优先级高于==
,因此它等效于:
judge1=(a>96)
假设为a
分配了一个值,a>96
将该值与96进行比较,并得出0或1。然后将此值分配给judge1
,覆盖从==
中读取的内容。用户。假设您打算使用judge1==0
,这也没有道理。在这种情况下,judge1==1
或a>96
的评估取决于judge1
的结果。因此,仅当a
为1且judge1
大于96或a
为0且a
小于或等于96时,以上表达式才成立。 >
另一个问题是scanf("%f",&judge1);
从未分配值。您似乎给人的印象是,当您调用a
时,读取的第一个字符将写入a
中。没有链接会导致这种情况发生,因此fgets
未被初始化。
您要执行的操作是使用strtof
读取一行文本,然后使用float
读取strtof
。 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);
读取并存储了换行符),那么您就知道您读取了一个非浮点字符。>
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将其取出。还要应用建议的检查记录,它应该可以工作。
它什么也没提供,只是与更大的画面弄混了。