2015-04-26 31 views
0

我这样做,但遗憾的是它不工作,当输入为char /串崩溃等如何确保用户输入一个正数

如何解决呢?

while((scanf("%d",&numOfDef) != 1) && (numOfDef>0)) 
{ 
    printf("not a pos num try again"); 
} 
+2

numOfDef> 0与你所需要的完全相反,用numOfDef尝试<1 –

回答

0

实际上,需要两个变化进行:while((scanf("%d",&numOfDef) >= 0) && !(numOfDef>0))

首先,比较scanf与返回值为0,其次的条件应该是scanf要么!(numOfDef>0)(numOfDef<=0)

返回值(数据来源:http://www.geeksforgeeks.org/g-fact-10/) :

在C中,printf ()返回成功写入输出的字符数,scanf()返回成功读取的项数。

Ideone链接代码:http://ideone.com/TjtuDy

+0

如果scanf失败,它将返回0,在这种情况下循环结束,并且numOfDef不会被设置。该变量保持未初始化。这不是理想的行为。 – 2501

+0

当我建议的事情,它不会崩溃,但也跳过这一段时间,甚至不输入积分intger –

+0

@RazBenNetanel:它现在工作吗? –

0
numOfDef = 0; 
while((scanf("%d",&numOfDef) != 1) || (numOfDef<=0)) 
{ 
    printf("not a pos num try again\n"); 
    int ch; 
    while((ch=getchar())!= '\n' && ch != EOF); 
    if(ch == EOF){ 
     numOfDef = 0; 
     break; 
    } 
} 
if(numOfDef == 0) 
    puts("Processing was discontinued."); 
... 
+0

它不能说是一个错误。因为由于OP的愿望。 – BLUEPIXY

+0

正确的输入不清楚。 – BLUEPIXY

+0

[DEMO](http://ideone.com/jARe3Y) – BLUEPIXY

0

它往往是比较容易处理输入的字符串,从用户采取数字输入,即使,然后将字符串转换为数字:

#include<stdio.h> 

int main (void) { 

    char buf[32] = {0}; 
    int num = -1; 

    while (num < 0) { 
     printf (" Enter a positive number: "); 
     if (scanf (" %[^\n]%*c", buf) == 1) { 
      if (*buf < '0' || *buf > '9') continue; 
      sscanf (buf, " %d", &num); 
     } 
    } 

    printf ("\n You entered : %d\n\n", num); 

    return 0; 
} 

输出

$ ./bin/positive_entry 
Enter a positive number: --1--1 1--1 
Enter a positive number: #%@#&%$ u08$ 
Enter a positive number: wise guys^2 
Enter a positive number: -127 
Enter a positive number: -3 
Enter a positive number: a 
Enter a positive number: 2 

You entered : 2 
+0

如果scanf失败(返回非1值),则循环结束,并且您打印的值不是正值。 – 2501

+0

您可以通过调整测试来防止角落案件。这是一个例子。 –

+0

当然,我只是提到,因为OP没有明确说明具体要求是什么。 – 2501

相关问题