验证C中的输入

时间:2014-07-03 14:37:34

标签: c scanf

我想编写一个程序,以便读取两个POSITIVE INTEGER作为输入,如果用户输入除两个正整数之外的任何内容,则拒绝。我试图使用以下代码,但它不起作用。

编辑1:删除了第一个scanf。 编辑2:添加了检查负值的代码。

不起作用的代码:

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

int main () {

unsigned int no1,no2,temp;
char check;
printf("Enter two positive integers.\n");
scanf("%i %i %c", &no1, &no2 ,&check);

if(scanf("%i %i %c", &no1, &no2,&check) != 3 || check != '\n'){
    printf("Invalid input!!.\n");
    exit(EXIT_FAILURE);

}
else if (no1 <= 0 || no2 <= 0) {

        printf("Invalid input!!.\n");
        exit(EXIT_FAILURE);

     }



int copy1,copy2;

copy1 = no1;
copy2 = no2;

while(no2 != 0) {

    temp = no1 % no2 ;
    no1 = no2;
    no2 = temp ;
}

printf("The H.C.F. of %i and %i is %i. \n",copy1,copy2,no1);

return 0;

}

工作代码:

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

int main () {

int no1,no2,temp;

printf("Enter two positive integers.\n");
int numArgs = scanf("%i%i", &no1, &no2 );


if( numArgs != 2|| no1 <= 0 || no2 <= 0 ){
    printf("Invalid input!!.\n");
    exit(EXIT_FAILURE);
}




int copy1,copy2;

copy1 = no1;
copy2 = no2;

while(no2 != 0) {

    temp = no1 % no2 ;
    no1 = no2;
    no2 = temp ;
}

printf("The H.C.F. of %i and %i is %i. \n",copy1,copy2,no1);

return 0;

}

直到我连续输入5个整数或2个字符而不是\ n。它永远不会计算H.C.F.但是,如果我删除“if”块,它就可以工作。

编辑3:现在我不想阅读换行符。

检查负值的第二个if块也不起作用。

2 个答案:

答案 0 :(得分:3)

问题中显示的代码中存在两个问题(编辑前):

  1. 您为相同的变量拨打scanf 两次,强制用户输入两次相同的数据。

  2. 使用的格式不会读取换行符,因此表达式check != '\n'将始终为真。

  3. 对于数字1,只需删除第一个scanf电话。对于数字2,用户必须按 Enter 键才能结束输入,因此无需检查。如果你真的想确定,那么使用例如fgets要读取其中包含数字的行,并使用sscanf来解析值。

答案 1 :(得分:2)

 scanf("%i %i %c", &no1, &no2 ,&check);

    if(scanf("%i %i %c", &no1, &no2 ,&check ) != 3 || check != '\n' )

问题出在这里。你正在调用scanf()两次,这意味着它要检查两次输入。如果要检查输入的数量,只需在第一次从用户处获取时保存scanf的返回值;此外,无符号整数应使用%u“扫描”,而不是%i。阅读有关scanf()here的更多信息。

另外,我认为scanf实际上并没有考虑换行符。但是,用户必须按Enter键才能向您提交输入,因此您无需进行检查。

    int numArgs = scanf("%u %u", &no1, &no2);

if(numArgs != 2){ ....

但是,如果您因某种原因想要检查换行符,请尝试以下操作:

int numArgs = scanf("%u %u%c", &no1, &no2, &check);
if(numArgs != 3 || check != '\n'){ ....