我的程序错误检查需要帮助。我要求用户输入一个整数,我想检查用户输入是否是整数。如果没有,请重复扫描。
我的代码:
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;
}
答案 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
是否读取整数。我使用的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;
}
答案 3 :(得分:0)