`
switch(selectedOption){
case 'B':
printf("Please enter the first number\n");
if (scanf("%f", &firstNumber) == 1){
printf("Is a valid number\n");
}
else{
printf("Is not a valid number\n");
}
}
`
我有一项学校作业,在那里我必须编一个计算器。其中一个要求是要求用户输入另一个数字,例如,如果他们输入一个字符而不是一个数字。我不知道该怎么做,我到处找,没有什么解决办法。如果有人能帮我解决这个问题,我将不胜感激。
发布于 2022-11-16 10:31:56
简单的答案是循环,直到读取了有效的输入(假设输入来自交互代理,比如坐在终端上的人)。
下面的将不能工作
switch(selectedOption){
case 'B':
while (1) {
printf("Please enter the first number\n");
if (scanf("%f", &firstNumber) == 1){
printf("Is a valid number\n");
break;
}
else{
printf("Is not a valid number\n");
}
}
/* ... */
break;
}
问题是,当scanf
看到一个不属于数字的字符时,它将停止读取输入,并将该字符推回流(c.f )。ungetc
)。例如,如果输入是-foo
,scanf
将读取空格,然后是-
(可能是数字的一部分),然后是不属于数字的f
。f
将被推回流中,scanf
将返回0。在while循环的下一次迭代中,scanf
将读取f
,将其推回流并返回0。无限循环,超超。
要打破无限循环,代码需要从流中读取一些内容并丢弃它。一个选项是通过调用scanf("%*s");
读取和丢弃下一个单词,或者通过调用scanf("%*s%*c");
丢弃下一个单词和下面的空格字符,或者通过调用scanf("%*[^\n]%*c");
丢弃行的其余部分和换行符。例如:
switch(selectedOption){
case 'B':
while (1) {
printf("Please enter the first number\n");
if (scanf("%f", &firstNumber) == 1){
printf("Is a valid number\n");
break;
}
else{
printf("Is not a valid number\n");
scanf("%*s");
}
}
/* ... */
break;
}
注意,上述代码将认为输入(如42foo
)是有效的。scanf
将把f
推回流上并返回1,因为它已经读取了一个有效的数字42
。你可能想读下一个字符,并检查它是否有意义。您始终可以通过调用ungetc(ch, stdin);
将至少一个字符推回流中,以便以后可以重新读取该字符。
发布于 2022-11-16 09:45:14
你不需要开关箱。你只需要做:
while (true) {
char number = 0;
scanf_s("%c", &number);
if (number >= '0' && number <= '9') break;
else printf("Is not a valid number\n");
}
https://stackoverflow.com/questions/74464758
复制