2013-12-17 2 views
2

Мой код не отвечает, когда я его запускаю, я не могу понять, проблема, но моя лучшая догадка - это часть рекурсивного вызова в разделе elsestrcheck.Vowel Count in 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' uninitialized, а два: вы не используете возвращаемое значение рекурсивного вызова. – 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

Здесь работает пайса .. Были ошибки в вашем коде

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; 
    } 
}