我的程序适用于无效输入,例如char,数字超出范围,但是当输入浮点值(例如1.2)时会出现问题。程序再次打印菜单,并在打印错误信息之前要求用户输入。我试图修复的是不再打印菜单,但仍然很难。例如,
做出选择:1.1 [这是菜单内容] 进行选择:该选择无效。请再试一次。
#include <stdio.h>
#define QUIT 0
int menu();
int main(void)
{
int choice;
char c;
choice = menu();
while(choice != QUIT) //execute so long as choice is not equal to QUIT
{
choice = menu();
}
}
int menu(void)
{
int option;
printf("Text Encoder Service\n\n");
printf("1.\tEnter name of input file (currently 'Secret.txt')\n");
printf("2.\tEnter name of output file (currently not set)\n");
printf("3.\tEnter number of characters data should be shifted (currently +7)\n");
printf("4.\tEncode the text\n\n");
printf("0.\tQuit\n\n");
printf("Make your selection: ");
while( (scanf(" %d", &option) != 1) /* non-numeric input */
|| (option < 0) /* number too small */
|| (option > 4)) /* number too large */
{
fflush(stdin); /* clear bad data from buffer */
printf("That selection isn't valid. Please try again.\n\n");
printf("Your choice? ");
}
return option;
}
答案 0 :(得分:0)
1.1
的输入会导致以下内容:
scanf()
呼叫停止,并返回成功扫描的值的数量。让我们测试一下:
#include <stdio.h>
int main(int argc, char ** argv)
{
while (1) {
int option;
int n = scanf(" %d", &option);
printf("%d %d\n", n, option);
if (n <= 0) break;
}
}
这个程序读了一行。
假设我输入123 132
。
然后发生以下情况:
*由于格式字符串以空格开头,因此消耗所有前导空格。在这种情况下,没有。
*然后消耗123
并将其放入option
。
*由于格式字符串已结束,因此解析已停止,n=1
和option=123
。
*在下一个循环运行中,同样的情况发生,给出n=1
和option=123
。
但是:假设我输入123.321
或123#321
。
然后发生以下情况:
*由于格式字符串以空格开头,因此消耗所有前导空格。在这种情况下,没有。
*然后消耗123
并将其放入option
。
*由于格式字符串已结束,因此解析已停止,n=1
和option=123
。
*在下一个循环运行中,没有要跳过的空格。 .321
resp。尝试将#321
与%d
匹配,但这些都不是有效的整数。因此,我们得到n=0
和option
保留其旧值。
*由于输入流中没有消耗任何字符(使用的字符再次被放回),所以同样会一次又一次地发生 - 这就是我放if (n <= 0) break;
的原因。
所以你看到这个行为与浮点无关,因为如果我们使用.
或#
来“干扰”并不重要。
我们将程序更改为
#include <stdio.h>
int main(int argc, char ** argv)
{
while (1) {
int option; char c;
int n = scanf("%d%c", &option, &c);
printf("%d %d %d %c\n", n, option, c, c);
if (n <= 0) break;
}
}
并运行它,输入4.235#6x7
。
然后我们得到
第一次运行时n=2
,option=4
和c='.'
第二轮* n=2
,option=235
和c='#'
第3轮* n=2
,option=6
和c='x'
第3轮* n=2
,option=7
和c='\n'
(换行)
并提示您进一步输入。
这使您可以选择
(parsed_inputs = scanf("%d%c", &option, &overcount_char)) < 1
,然后检查overcount_char
包含的内容,只要parsed_inputs
为&gt; 1。
答案 1 :(得分:0)
我终于可以验证浮动输入了。非常感谢你的建议!这是我的新代码。您认为无效输入还有什么?
int menu(void)
{
int option, parsed_inputs;
char overcount_char;
parsed_inputs = 1;
printf("Text Encoder Service\n\n");
printf("1.\tEnter name of input file (currently 'Secret.txt')\n");
printf("2.\tEnter name of output file (currently not set)\n");
printf("3.\tEnter number of characters data should be shifted (currently +7)\n");
printf("4.\tEncode the text\n\n");
printf("0.\tQuit\n\n");
printf("Make your selection: ");
parsed_inputs = scanf_s("%d%c", &option, &overcount_char);
while( parsed_inputs > 1 ) /* number too large */
{
if((overcount_char != '\n') || (option < 0) || (option > 4))
{
fflush(stdin); /* clear bad data from buffer */
printf("That selection isn't valid. Please try again.\n\n");
printf("Your choice? ");
scanf_s("%d%c", &option, &overcount_char);
}
else
break;
}
return option;
}
答案 2 :(得分:-1)
我认为你应该在while循环之前放置scanf()并在while循环中显式检查“option”变量。 发生了什么,这里scanf()总是返回值1,因为scanf()返回no。参数读取成功。因此,while循环将永远运行。有关详细信息,请查看此链接 - &gt; http://www.cplusplus.com/reference/cstdio/scanf/
希望这有帮助!