2014-07-03 205 views
0

我想編寫一個程序,以讀取兩個POSITIVE INTEGER作爲輸入,並拒絕用戶輸入除兩個正整數以外的任何內容。我嘗試使用下面的代碼,但它不起作用。驗證輸入C

編輯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

您是否試圖讀取兩次變量?如果沒有,在第一個'printf'調用之後移除'scanf'。另外,'%c'不是真的需要。 – Hasturkun

+2

如果你想讀取一個正數(即無符號)整數,爲什麼你使用''%i'''格式代碼(已簽名)?你不應該用'「%u」'來代替嗎? –

+0

@Hasturkun即使刪除它不起作用。 –

回答

1
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實際上並沒有考慮換行符。但是,用戶必須按回車鍵才能將輸入提交給您,因此您不必檢查它。

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

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

但是,如果你真的要檢查由於某種原因,換行符,試試這個:

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

我試過你的代碼。但即使如此,我仍然在輸入兩個整數後繼續按回車,但沒有任何反應。但是,如果在兩個整數之後輸入一個字符,那麼鞋子'無效輸出'@RickyMutschlechner –

+0

嗨@AbhirupMondal,我編輯了我的答案。請看一下。 –

+0

@RickyMutschlechner使用'%u'不會驗證整數是正數,它只是告訴'scanf'嘗試解釋用戶輸入,請參閱[本示例](http://ideone.com/mDUwn7)它解釋2s恭維-4294967280爲(+)16 ... – Scis

3

你必須在代碼中的兩個問題,如圖中的問題(編輯之前) :

  1. 你叫scanf兩次相同的變量,強迫用戶輸入相同的數據的兩倍。

  2. 使用的格式不會讀取換行符,因此表達式check != '\n'將始終爲真。

對於編號1,只需刪除第一個scanf調用。對於編號2,用戶必須按輸入鍵才能結束輸入,因此無需檢查。如果您確實需要確定,那麼請使用fgets可以讀取包含兩個數字的行,並使用sscanf解析數值。

+0

你打敗了我,但你在兩方面都是正確的。 –

+0

我會注意到,如果他真的想閱讀換行符,格式化字符串應該是'%i%i%c',否則它'scanf'將消耗換行符(以及其他任何空格) – Hasturkun