C编程 - 循环直到用户输入数字scanf

时间:2014-09-10 12:07:04

标签: c if-statement scanf

我的程序错误检查需要帮助。我要求用户输入一个整数,我想检查用户输入是否是整数。如果没有,请重复扫描。

我的代码:

int main(void){

  int number1, number2;
  int sum;

  //asks user for integers to add
  printf("Please enter the first integer to add.");
  scanf("%d",&number1);

  printf("Please enter the second integer to add.");
  scanf("%d",&number2);
  //adds integers
  sum = number1 + number2;

  //prints sum
  printf("Sum of %d and %d = %d \n",number1, number2, sum);

  //checks if sum is divisable by 3
  if(sum%3 == 0){
    printf("The sum of these two integers is a multiple of 3!\n");
  }else {
    printf("The sum of these two integers is not a multiple of 3...\n");
  }
  return 0;
}

4 个答案:

答案 0 :(得分:7)

scanf根据您的格式返回已成功读取的项目数。您可以设置仅在scanf("%d", &number2);返回1时退出的循环。然而,诀窍是在scanf返回零时忽略无效数据,因此代码如下所示:

while (scanf("%d",&number2) != 1) {
    // Tell the user that the entry was invalid
    printf("You did not enter a valid number\n");
    // Asterisk * tells scanf to read and ignore the value
    scanf("%*s");
}

由于您在代码中多次读取数字,请考虑使用函数隐藏此循环,并在main中调用此函数两次,以避免重复。

答案 1 :(得分:1)

以下是您的问题的解决方案。我刚修改了一些代码。 阅读任何解释的评论。

#include<stdio.h>

#include<stdlib.h>      //included to use atoi()
#include<ctype.h>       //included to use isalpha()

#define LEN 3   //for two digit numbers

int main(void)
{

    char *num1=malloc(LEN);
    char *num2=malloc(LEN);
    int i,flag=0;

    int number1,number2;
    int sum;

    do
    {
        printf("Please enter the first integer to add = ");
        scanf("%s",num1);
        for (i=0; i<LEN; i++)   //check for every letter of num1
        {
            if (isalpha(num1[i]))   //isalpha(num1[i]) returns true if num1[i] is alphabet
            {                       //isalpha() is defined in ctype.h
                flag=1;             //set flag to 1 if num1[i] is a alphabet
            }
        }
        if(flag)
        {
            printf("Not a valid Integer\n");
            flag=0;
            continue;
        }
        else
        {
            break;
        }
    } while(1);

    do
    {
        printf("Please enter the second integer to add = ");
        scanf("%s",num2);
        for (i=0; i<LEN; i++)
        {
            if (isalpha(num2[i]))
            {
                flag=1;
            }
        }
        if(flag)
        {
            printf("Not a valid Integer\n");
            flag=0;
            continue;
        }
        else
        {
            break;
        }
    } while(1);

    //strings to integers
    number1= atoi(num1);    //atoi() is defined in stdlib.h
    number2= atoi(num2);

    //adds integers
    sum = number1 + number2;

    //prints sum
    printf("Sum of %d and %d = %d \n",number1, number2, sum);

    //checks if sum is divisable by 3
    if(sum%3 == 0)
    {
        printf("The sum of these two integers is a multiple of 3!\n");
    }
    else
    {
        printf("The sum of these two integers is not a multiple of 3...\n");
    }
    return 0;
}

我只为两位数字设计了这个数字,但对于我而言,它对两位数以上的数字工作正常。 请告诉我你的情况也是如此。
如果您发现为什么会这样,请发表评论。

您还可以使用strtol()代替atoi()。由于价值较小,我没有使用它。

atoi()strtol()

之间的差异

atoi()
亲:简单 专业:转换为int Pro:在C标准库中 亲:快。
Con:没有错误处理。
Con:既不处理十六进制也不处理八进制。

strtol()
亲:简单 Pro:在C标准库中 亲:良好的错误处理。
亲:快。
Con:转换为long,而不是int,其大小可能不同。

答案 2 :(得分:0)

我想说你必须进行一些自定义验证,以检查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;
}

答案 3 :(得分:0)

解决此问题的方法可以是

  1. 使用fgets()stdin读取。

  2. 使用strtol()将值转换并存储到int。然后检查char **endptr以确定转换是否成功[表示整数]。

  3. 执行剩余任务。