C++ 用户为整数变量输入非整数值

C++ User enters a non-integer value for integer variable

本文关键字:整数 输入 变量 C++ 用户      更新时间:2023-10-16

我正在开发向用户显示选项列表的程序,然后他将输入一个整数来指定他要选择的选项。现在我已经抢占了用户可能输入除有效值之外的整数值的情况。但是,如果他输入任何其他值,例如字符或字符串,程序将进入无限循环,无限打印选项列表。我该如何纠正这种情况?我的意思是,当预定义的整数变量输入一个不是整数的值时,我应该能够给我的用户一个错误。

任何帮助表示赞赏。下面是一个示例代码。

do{
    printf("Select appropriate option.n");
    printf("Press 1 to do this");
    printf("Press 2 to do that.n");
    printf("Press 3 to exit the program.n");
    scanf("%d",&choice);
    if(choice!=1 && choice!=2 && choice!=3)
        printf("You entered an invalid choice. Please enter again.n");
    switch(choice){
        case 1:
            //do this
             break
        case 2:
            //do that
            break;
        case 3:
            exit(1);
           }}

while(choice!=3);

所以基本上当用户输入非整数值时choice我希望程序通知用户并要求他输入另一个。

它不能通过直接scanf到整数变量来完成。这样的scanf不仅接受1.23,还会接受1abcde和其他输入。 scanf(和其他转换函数)根据请求的格式尽可能多地读取。当它发现不满足格式要求的内容时,它会停止,并且只是保持原样。

如果要执行此类分析,则必须将输入读取为字符串,然后手动解析和分析该字符串

C 风格的代码

草图(因为你坚持使用 C 风格的代码,尽管它被标记为 [C++])可能如下所示

char buffer[100]; /* 100 should be enough for everyone :) */
int n = scanf("%s", buffer);
if (n < 1)
  /* ERROR, can't read */;
char *end;
long choice = strtol(buffer, &end, 10); 
if (end == buffer || *end != '' || errno == ERANGE)
  /* ERROR, bad format */;
/* ... */
scanf

转换%d时不会消耗任何非数字。 它将返回0,因为它没有转换任何内容,并且"错误输入"仍将在那里等待被消耗。 您必须以某种方式使用它才能为有效输入做好准备。

(另请注意,在switch中测试之前,您在if中排除了 3 个)

  1. 使用 iostream - 请参阅 http://www.cplusplus.com/reference/iostream/
  2. 话虽如此,如果您坚持使用 scanf - 检查返回值 - 即读取 http://linux.die.net/man/3/scanf

>isdigit将检查任何数字(数字)类型的输入。为此,包括标头 ctype.h。

如果输入不正确,还可以使用 exit(0) 终止程序。为此,包括标头 stdlib.h。

#include<ctype.h>
#include<stdlib.h>
char c;
scanf("%c", &c);
if (isdigit(c)) 
{
case statement...
...
...
}
else
{
 printf("Wrong input");
 exit(0);
}