C中的递归数组函数

时间:2017-07-31 02:20:48

标签: 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;
}

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

2 个答案:

答案 0 :(得分:5)

这一行

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

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

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

numbers_greater(wordlist, average, n + 1);

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

答案 1 :(得分:2)

让我们一起来看看

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

我有一个字符串数组,可以容纳3件事,我把n = 1.它第一次工作......但现在我们到了

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

所以现在我们有一个字符串数组,由于wordlist+1可以容纳2个字符串。现在n = 2,所以n < ARRAY_LEN为真,但是wordlist[n]将导致读取一个只能容纳2的数组中的第3个元素。

要修复此尝试

numbers_greater(wordlist, average, n+1);