当用户输入不正确的值以避免程序崩溃时,在C中进行数据验证

时间:2014-09-01 06:57:41

标签: c int user-input scanf validation

如何确保用户只输入一个整数值,以便程序不会崩溃?

如果用户输入的不是整数,我想: printf(“请重新检查您的条目);

printf("How many values do you want to enter? \t");
    int g;
    scanf("%d", &g);

3 个答案:

答案 0 :(得分:2)

我想说,检查scanf的返回值:

  

这些函数返回成功匹配和分配的输入项的数量,可以少于提供的数量,或者在早期匹配失败的情况下甚至为零。

     

如果在第一次成功转换或匹配失败发生之前达到输入结束,则返回值EOF。如果发生读取错误,也会返回EOF,在这种情况下,将设置流的错误指示符(请参阅ferror(3)),并设置errno指示错误。

答案 1 :(得分:1)

我想说你必须进行一些自定义验证,以检查scanf是否读取整数。

我还建议使用fgetsscanf()中没有边界检查)

你可以做这样的事情

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

int validate ( char *a )
{
  unsigned x;
  for ( x = 0; x < strlen ( a ); x++ )
    if ( !isdigit ( a[x] ) ) return 1;
  return 0;
}

int main ( void )
{
  int i;
  char buffer[BUFSIZ];
  printf ( "Enter a number: " );
  if ( fgets ( buffer, sizeof buffer, stdin ) != NULL ) {
    buffer[strlen ( buffer ) - 1] = '\0';
    if ( validate ( buffer ) == 0 ) {
      i = atoi ( buffer );
      printf ( "%d\n", i );
    }
    else
      printf ( "Error: Input validation\n" );
  }
  else
    printf ( "Error reading input\n" );
  return 0;
}

答案 2 :(得分:0)

尝试这样的事情 -

#include<stdio.h>
int main()
{
        int num;
        printf("Enter the number\n");

        if((scanf("%d",&num)) == 1){ // checking return value of scanf here!

                printf(": %d\n",num);
                // do your stuff here
        }
        else
                printf("Please recheck your input!\n");

        return 0;
}

此处如果输入被正确读取并分配scanf将返回1,否则它将返回0.

示例输出 -

root@sathish1:~/My Docs/Programs# ./a.out 
Enter the number
2
: 2
root@sathish1:~/My Docs/Programs# ./a.out 
Enter the number
asd
Please recheck your input!