2014-07-26 40 views
0

如何使用單個while循環來限制負整數到代碼的輸入。我以前曾嘗試用兩個while循環爲兩個scanf()並且工作很酷。但我無法想象我們如何將它們合併成一個while循環。我已經刪除了原來使用的兩個循環。我完全不熟悉這一點,我需要一些想法。如何驗證,以便用戶只能輸入正整數

#include <stdio.h> 

int main() 

{ 
    int num, uplimit, a; 

    printf("Which multiplication table do you want? "); 

    scanf("%d",&num); 

    printf("Please enter the upper limit: "); 

    scanf("%d",&uplimit); 


    printf("\nMultiplication Table for %d\n", num); 

    printf("===========================\n\n"); 


for(a=1;a<=uplimit;++a) 

{ 

    printf("%d X %d = %d %s\n", a, num, num*a, (num*a % 2 == 0) ? "*" : " "); 

} 

{ 

    printf("\n* indicates even multiple of %d", num); 

} 

return 0; 
} 
+1

的可能的複製[檢查是否輸入在C整數類型](http://stackoverflow.com/questions/ 4072190 /檢查是否輸入-是整數型在-C)。 – BlackDwarf

+0

如果您閱讀例如[這個'scanf'(和家庭)參考](http://en.cppreference.com/w/c/io/fscanf),你將看到一個格式代碼表。我相信你可以找到一種適合閱讀非負整數的格式。 –

+0

@JoachimPileborg:你的意思是%u和%x?他們接受負面的投入。例如,輸入-1會給出'UINT_MAX',而不會顯示錯誤。 – mafso

回答

3
char c; 

while (((c = getchar()) != '\n') && (c != EOF)); 
scanf("%d",&num); 
while (num < 0) 
{ 
    printf("You should use positive numbers!"); 
    while (getchar() != '\n'); 
    scanf("%d", &num); 
} 

內,而使得輸入緩衝器,以清潔,如果有輸入一些字母。 另外,它使得可以將while (((c = getchar()) != '\n') && (c != EOF));轉換成函數。

+0

可以通過做whiles和其他綁定來改善很多。 –

+0

do {}儘管如果第一次輸入嘗試沒有額外的檢查是正確的,不要寫錯誤消息,這樣做嗎? – Xandrmoro

+0

是的,但我怎麼輸入10a。你的代碼會說沒關係,但用戶輸入了10a而不是10 –

3

只需更換您的scanfs本:

while(scanf("%d", &num) != 1 || num < 0) 
    while ((c = getchar()) != '\n' && c != EOF); 
+0

我正要回答這個問題。更好的思考。你需要吃掉垃圾,即如果它不是一個數字,就吃下一個角色。 BTW -1是苛刻的,我會糾正 –

+0

謝謝,是啊,我不明白它來自哪裏:) –

+0

當你輸入一個字符而不是一個整數時,它將不被scanf接受,因此保持在緩衝區中,下次進入循環再次scanf將看到該字符。所以你需要以某種方式清除它 – mSatyam

-6

也許這可以幫助你,如果你只輸入整數。 你輸入負值將被轉換爲相同的正值像-500將500

#include<stdio.h> 
void main() 
{ 
    unsigned int n,x;  
    scanf("%u",&n); 
    x=(~n)+1; 
    printf("%u",x); 
} 
+1

[不,不一定](http://stackoverflow.com/questions/50605/signed-to-unsigned-conversion-in-c-is-it-always-safe) 。 – Jamal

+6

絕對無意義 –

+0

確切地說,負數如何轉化爲正數?如果它的模數很大,那不是沒用嗎? –