2013-12-17 50 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; 
    } 
}