C ++ User为整数变量输入非整数值

时间:2013-09-22 05:23:19

标签: c++ input

我正在处理程序,其中向用户显示选项列表,然后他将输入一个整数来指定他想要选择哪个选项。现在我已经抢占了用户可能输入整数值的情况除了有效的。但是如果他输入任何其他值,比如一个字符或一个字符串,程序就会进入一个无限循环,并且无限打印选项列表。我怎么能纠正这个?我的意思是,对于预定义的整数变量,我输入一个不是整数的值时,我应该能够给我的用户一个错误。

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

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的非整数值时,我希望程序通知用户并要求他提供其他输入。

4 个答案:

答案 0 :(得分:1)

使用直接scanf进行整数变量无法完成。此类scanf不仅会接受1.23,还会接受1abcde和其他输入。 scanf(和其他转换函数)根据请求的格式尽可能多地读取。当它找到不符合格式要求的东西时,它就会停止,只是让它不受影响。

如果要执行此类分析,则必须将输入读作 string ,然后手动解析并分析该字符串。

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 != '\0' || errno == ERANGE)
  /* ERROR, bad format */;

/* ... */

答案 1 :(得分:0)

转换scanf时,

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

(另请注意,在if进行测试之前,您已将switch中的3个排除在外)

答案 2 :(得分:0)

  1. 使用iostream - 请参阅http://www.cplusplus.com/reference/iostream/
  2. 说过如果你坚持使用scanf - 请检查返回值 - 即阅读http://linux.die.net/man/3/scanf

答案 3 :(得分:0)

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);
}