递归打印数组,产生奇怪的输出

时间:2017-09-15 01:31:20

标签: c

我正在尝试编写一个C程序,该程序从.txt文件中获取输入,将单词存储在char指针数组中,平均字长并打印出超出平均长度的任何单词。现在我试图让print函数工作(print_array),我想以递归方式执行此操作。由于某种原因,打印功能没有打印出数组的所有元素,它只打印第一个元素并每次删除第一个字符。我在这做错了什么?干杯

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

#define ARRAYLEN 100
#define CHARLEN 79

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

void print_array(char *a, int n) {
    if (n > 0) {
        printf("%s\n", &a[0]);
        print_array(a + 1, n - 1);
    }
}


int main(void) {
    char word[CHARLEN];
    char *wordlist[ARRAYLEN];
    double average;
    int num_words;

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

    average = average / num_words;

    printf("Average is %.2f\n", average);

    print_array(*wordlist, num_words);


    return EXIT_SUCCESS;
}

输出 -

Average is 9.71
hello
ello
llo
lo
o

2 个答案:

答案 0 :(得分:2)

参数*wordlist是指向*wordlist[]的第一个元素的指针,但是你想要打印一个二维数组!因此代码必须如下所示:

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

void print_char_array(char *words[], int len) {
    if (len > 0) {
        printf("%s\n", words[0]);
        print_char_array(words + 1, len - 1);
    }
}

int main (int args, char *argv[]) {
    char *words[] = {
        "hello", "print", "array", "recursively", "output"
    };
    print_char_array(words, 5);
    return 0;
}

我的英语很差,希望代码可以帮到你!

答案 1 :(得分:1)

char *wordlist[ARRAYLEN];

这里我们有一个C字符串数组。

print_array(*wordlist, num_words);

这里我们遵循指针,获取数组中的第一个C字符串并将其传递给print_array

void print_array(char *a, int n) {
    if (n > 0) {
        printf("%s\n", &a[0]);
        print_array(a + 1, n - 1);
    }
}

这里我们取一个C字符串,如果n不为零,则打印它(&a[0]是指向数组中第一个元素的指针,最终与{ {1}}本身)。然后我们在C字符串指针中添加一个,这样我们就可以从第二个字符开始做同样的事情。等等。

解决方案:如果要打印C字符串数组,请使用a函数获取整个数组,而不仅仅是单个字符串 - 即。需要print_array而不是char **。然后,摆脱char *中的&和调用print_array的行中的*

编辑:正如@chux指出的那样,你的print_array也太小了。使它成为80,这样你的字符串就有79个字符的空间加上必要的空终止符。