c program.data验证。将char转换为整数

时间:2014-06-25 10:54:42

标签: c validation input

我正在编写一个程序,允许用户输入字母数字字符串并根据可用选项验证他们的输入。当我在下面运行我的代码时,即使我在该范围内输入了一个选项,它总是打印选项无效。任何人都可以帮助我吗?任何帮助都会得到很好的帮助。

#include<stdio.h>
#include<ctype.h>
#include<string.h>

int main (void){

char option;

do{
printf("\n\n----------------------------------------------------\n");
printf("Main Menu\n");
printf("----------------------------------------------------\n");
printf("1. Add Record\n");
printf("2. Delete record\n");
printf("3. List Record\n");
printf("4. Exit\n");
printf("----------------------------------------------------\n");

printf("Enter your option:");
scanf("%c",&option);

if(isdigit(option)){
switch(option){

    case 1:
    add();
    break;

    case 2:
    del();
    break;

    case 3:
    listrec();
    break;

    case 4:
    return 0;

    default:
    printf("The number that you have entered is invalid.Please enter a new option\n");
    break;

}

    else{   
    printf("The option that you have entered is invalid.Please enter a new option\n");  
    }

}while(option!=4);
return 0;
}

2 个答案:

答案 0 :(得分:2)

除了使用1而不是'1'(你需要将字符与字符进行比较,而不是数字),还有另一个问题 - 你没有从输入中获得回车,这使得输入在第二次传递时失败。请参阅下面的可能解决方案:

#include<stdio.h>
#include<ctype.h>
#include<string.h>

int main (void){

char option;

do {
  printf("\n\n----------------------------------------------------\n");
  printf("Main Menu\n");
  printf("----------------------------------------------------\n");
  printf("1. Add Record\n");
  printf("2. Delete record\n");
  printf("3. List Record\n");
  printf("4. Exit\n");
  printf("----------------------------------------------------\n");

  printf("Enter your option:");

  if(scanf("%c",&option)==1) {


    if(isdigit(option)){
      printf("you entered %c\n", option);
      switch(option){

      case '1':
        printf("adding\n");
        break;

      case '2':
        printf("deleting\n");
        break;

      case '3':
        printf("listing\n");
        break;

      case '4':
        return 0;

      default:
        printf("The number that you have entered is invalid.\nPlease enter a new option:\n");
        break;

      }

    }
    else {
      printf("you entered not a digit: %c\n", option);
      printf("The number that you have entered is invalid.\nPlease enter a new option:\n");
    }

    // empty the input buffer:
    while(getchar()!='\n');

  }

  }

} while(option!=4);
return 0;
}

有几点需要注意:

  1. 您的代码示例中缺少} - 在switchelse
  2. 的结尾之间
  3. 根据Nisse的评论,我检查scanf是否返回值1(有效转化)
  4. 我在if之后通过读取清空输入缓冲区,直到我得到EOL(在scanf之后保留在缓冲区中)。这确保了下一个字符读取是回车后的下一个字符,而不是回车本身。
  5. 杂项清理......

答案 1 :(得分:1)

包含数字的字符对象的整数值等于表示数字的相应字符的内部表示。例如,如果使用ASCII编码,那么例如'1'的内部表示等于49.所以你必须写

case 49:

而不是

case 1:

通过以下方式更改案例标签,它们不依赖于字符数字的内部表示。

    case '1':
    add();
    break;

    case '2':
    del();
    break;

    case '3':
    listrec();
    break;

    case '4':
    return 0;

    default:
    printf("The number that you have entered is invalid.Please enter a new option\n");
    break;

}

    else{   
    printf("The option that you have entered is invalid.Please enter a new option\n");  
    }

}while(option!='4');