Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当用户输入不正确的值以避免程序崩溃时,用C进行数据验证_C_Int_User Input_Scanf_Validation - Fatal编程技术网

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

当用户输入不正确的值以避免程序崩溃时,用C进行数据验证,c,int,user-input,scanf,validation,C,Int,User Input,Scanf,Validation,如何确保用户只输入一个整数值,这样程序就不会崩溃 如果用户输入的不是整数,我想: printf(“请重新检查您的输入) 我会说,检查scanf的返回值: 这些函数返回成功匹配和分配的输入项的数量,该数量可以少于提供的数量,如果早期匹配失败,甚至可以为零 如果在第一次成功转换或匹配失败发生之前到达输入端,则返回值EOF。如果发生读取错误,则也会返回值EOF,在这种情况下,设置了流的错误指示器(请参见ferror(3)),并设置了errno以指示错误 我想说的是,您必须进行一些自定义验证,以检查sc

如何确保用户只输入一个整数值,这样程序就不会崩溃

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


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

这些函数返回成功匹配和分配的输入项的数量,该数量可以少于提供的数量,如果早期匹配失败,甚至可以为零

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


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

我还建议使用
fgets
(在
scanf()
中没有边界检查)

你可以这样做

#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;
}
#包括
#包括
#包括
#包括
int验证(字符*a)
{
无符号x;
对于(x=0;x
试试这样的方法-

#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
的返回值。另请参阅,在检测到无效输入后,您可能希望刷新该行的其余部分。这肯定有一个很好的重复项。这肯定有很多其他问题是重复的。其中一些问题可能列在相关问题中,但我认为没有一个问题是重复的“规范”答案。您需要检查
scanf()
中的返回值,并将代码包装在一个循环中,如果转换失败,您可能会安排吞掉输入行的其余部分(因为您可能需要跳过输入
三十三
,在您希望输入
33
的地方)。您应该区分“转换失败”(0)和文件结尾(EOF)。此代码不允许前导或尾随空格,也不允许加号或减号。这是否重要是另一个问题。根据输入和使用的平台,此代码可能会调用未定义的行为。请注意,函数的参数类型为
int
,而不是
char
。根据该函数的文档,使用一个参数调用该函数,该参数的值不能表示为
unsigned char
,并且不是
EOF
的值。因此,对于签名为
char
的平台(大多数平台),某些输入将调用未定义的行为。您应该将参数强制转换为
unsigned char
。但是,像
23hahaha
这样的用户输入可能会被接受(并理解为23).我不知道这是否与OP有关。@BasileStarynkevitch如果是这样,我们需要以字符串格式扫描输入,必须检查每个字节!如果它是
int
,那么我们可以使用
atoi
转换它!
#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;
}
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!