C中的递归数组函数

Joh*_*ohn 0 c arrays recursion

程序查找给定输入中单词的平均长度,并打印大于平均值的单词.这是程序

#define STRING_LEN 80
#define ARRAY_LEN 3
void *emalloc(size_t s) {
    void *result = malloc(s);
    if (NULL == result) {
        fprintf(stderr, "Memory allocation failed!\n");
        exit(EXIT_FAILURE);
    }
    return result;
}


void numbers_greater(char **wordlist, int average, int n){

    if(n < ARRAY_LEN){
        int a = strlen(wordlist[n]);
        if(a>average){ 
            printf("%s", wordlist[n]);
        }
        numbers_greater(wordlist+1, average, n+1);
    }

 }


int main(void) {
    char word[STRING_LEN];
    char *wordlist[ARRAY_LEN];
    int num_words;
    double average;
    int i;

    while (num_words < ARRAY_LEN && 1 == scanf("%79s", word)) {
        wordlist[num_words] = emalloc((strlen(word) + 1) * sizeof wordlist[0][0]);
        strcpy(wordlist[num_words], word);
        num_words++;
    }


    average = 0.0;
    for (i = 0; i < num_words; i++) {
        average += strlen(wordlist[i]);
    }
    average = average / num_words;
    printf("%f\n", average);

    numbers_greater(wordlist, average, 0);



    for (i = 0; i < num_words; i++) {
        free(wordlist[i]);
    }
    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

该程序一直运行到"numbers_greater"方法,给出了分段错误错误.我是C的新手,所以我有点困惑,递归方法在没有strlen语句的情况下运行时没有错误,但是使用strlen语句(即使我将它设置为静态数字,如2)它会炸出码.我是否错误地遍历了数组?

bee*_*ane 5

这条线

numbers_greater(wordlist+1, average, n+1);

将递增wordlist指针和整数n.你正在做什么,实际上是你要检查的值增加2而不是一个,就像你想要的那样.

要消除段错误,请将此行更改为以下内容:

numbers_greater(wordlist, average, n + 1);

请注意,使用简单的for循环可以更轻松地完成此操作.此外,我没有阅读其余的代码,可能还有一些我错过的错误,但这应该消除此功能中的分段错误.