2014-07-26 45 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

确切地说,负数如何转化为正数?如果它的模数很大,那不是没用吗? –