2013-12-17 51 views
2

當我運行它時,我的代碼沒有響應,我似乎無法找出問題,但我最好的猜測是strcheckelse部分中的遞歸調用部分。通過遞歸計算C的元音

#include<stdio.h> 
#include<stdlib.h> 

int alphcheck(char *ptr) 
{ 
    if(*ptr=='a'||*ptr=='e'||*ptr=='i'||*ptr=='o'||*ptr=='u') 
     return 1; 
    else 
     return 0; 
}//close aplhcheck 

int strcheck(char *ptr) 
{ 
    int r; 

    if(ptr=='\0') 
     return 0; 
    else 
    { 
     r = alphcheck(ptr)+r; 
     strcheck(++ptr); 
     return r; 
    } 
}//close strcheck 

int main() 
{ 
    int res; 
    char name[] = "sahirnoorali"; 
    res = strcheck(name); 
    printf("%d",res); 
    return 0; 
}//close main 
+0

呃,其中之一:你使用'r'未初始化,和兩個:你沒有使用遞歸調用的返回值。 – Kninnug

+0

三:'if(ptr =='\ 0')'! – Nbr44

回答

0

的問題是在遞歸函數strcheck的鹼情況下,在這一行:

 if(ptr=='\0') 

它應該是:

 if(*ptr=='\0') 

此外,r變量是應該是功能的另一個參數:

int strcheck(char *ptr, int r) 
{ 
if(ptr=='\0') 
return 0; 

else 
{ 
// TODO: fix the two lines below: 
r = alphcheck(ptr)+r; 
strcheck(++ptr); 
return r; 
} 

這是一個累加器:從main你應該叫等於第二個參數的功能,以0:

res = strcheck(name, 0); 

以下是完整的工作代碼:

#include<stdio.h> 
#include<stdlib.h> 

int alphcheck(char *ptr) 
{ 
    return (*ptr=='a'||*ptr=='e'||*ptr=='i'||*ptr=='o'||*ptr=='u') ? 1 : 0; 
} 

int strcheck(char *ptr, int r) 
{ 
    if(*ptr=='\0') return r; 
    else 
    { 
    r += alphcheck(ptr); 
    return strcheck(++ptr, r); 
    } 
} 

int main() 
{ 
    int res; 
    char name[] = "sahirnoorali"; 
    res = strcheck(name, 0); 
    printf("%d\n",res); 
    return 0; 
} 
+0

它解決了運行問題,但輸出即將到來16384.現在來了呼叫問題。 – Sahir

+0

立即檢查出來。 – piokuc

+0

謝謝。你反過來了,我喜歡這種風格。 :) – Sahir

3

r未初始化。這將調用未定義的行爲,您可能會得到垃圾值。在另外一個是

if(ptr=='\0') 

你是ptr這是錯誤的分配空終止符。您必須使用解引用運算符*,然後分配\0

if(*ptr=='\0') 
+0

沒有初始化 – Sahir

+2

@Sahir你在分配給它之前在表達式*中使用了'r'。所以你在未初始化時使用它。 –

+0

好吧,你的意思是我宣佈它,但沒有正確初始化?但是這樣做並且* ptr不能解決問題,所以結果爲0。 – Sahir

0

這裏是工作的PICE .. 。你的代碼中存在一些缺陷

int strcheck(char *ptr) 
{ 
    static int r = 0; // Declare r as static and initialize it to 0 

    if(*ptr=='\0') // Comparision problem. 
     return 0; 

    else 
    { 
     r = alphcheck(ptr)+r; 
     strcheck(++ptr); 
     return r; 
    } 
}