2015-02-09 59 views
0

這個函數的想法是要求一個正值,並確保一個負值不會使用遞歸插入。正值輸入C

然而,當我測試它,如果我輸入的第一個值是負數,而該函數的工作,並不允許代碼繼續下去,直到輸入一個正值,代碼仍然打印插入的第一個值,無論如果它滿足了回報的要求。

#include <stdio.h> 

float scanval() 
{ 
    float x; 
    printf("Insert positive value \n"); 
    scanf("%f", &x); 

    if(x<0){ 
    printf("Not a valid value \n"); 
    scanval(); 
    } 

    return x; 
} 

main() 
{ 
    printf("Value given %f \n", scanval()); 
} 
+0

你真的不想爲此使用遞歸 - 使用循環。 – 2015-02-09 17:45:48

回答

2

也許你應該記得保存返回值。

+0

你應該清楚必須在哪裏,我認爲你一開始就錯了。 – 2015-02-09 17:47:19

+0

@iharob - 我在「函數內部」添加了。這是否清楚? – 4386427 2015-02-09 17:49:13

0

首先認識到遞歸在這裏不是合適的技術。
您應該使用,而循環。

但是如果你需要無論什麼家庭作業的目的遞歸:在函數內部

x = scanval() 

float scanval() 
{ 
    float x; 
    printf("Insert positive value \n"); 
    scanf("%f", &x); 

    if (x<0){       // While x is negative, 
    printf("Not a valid value \n"); // Showing an error message, 
    x = scanval();     // Try the routine again. 
    } 

    return x; 
} 
+1

他並不是在尋求真正的生活解決方案,而是爲了如何解決這個遞歸問題。 – Haini 2015-02-09 17:47:26

0

你應該能夠做到平凡如下:

if(x<0){ 
    printf("Not a valid value \n"); 
    return scanval(); 
    } 

當然,最好的做法是隻在一個功能單一的回報,但我不認爲你關心這個,因爲你」重新嘗試用遞歸來完成這個任務!

0

你可以做的另一件事,就是這個

float scanval() 
{ 
    float x; 

    printf("Insert positive value \n"); 

    if ((scanf("%f", &x) != 1) || (x < 0)) 
    { 
     int chr; 
     while (((chr = getchar()) != EOF) && (chr != '\n')); 
     return scanval(); 
    } 
    return x; 
} 

通知,我也檢查,如果輸入的是有效的,對有效輸入scanf()會在這種情況下返回1,所以檢查是同樣重要的。

而且你還需要刪除從輸入緩衝器中的剩餘空格,以便您可以使用此

int chr; 
while (((chr = getchar()) != EOF) && (chr != '\n')); 

如果不檢查有效的輸入,你可能訪問x當它未初始化導致未定義的行爲。