2017-09-15 50 views
0

我想写一个C程序,它从.txt文件获取输入,将这些单词存储在一个char指针数组中,平均单词长度并打印出超出平均值的任何单词长度。现在我正试图获得一个打印函数工作(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

'char word [CHARLEN];'对于''%79s“'来说太小了。 – chux

+0

另外,如果您使用宏'CHARLEN',则最好使用'“%”#CHARLEN“%s”'。 –

回答

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]是一个指针阵列中的第一个元素,这将最终被相同a本身)。然后我们给C字符串指针添加一个,这样我们就可以从第二个字符开始做同样的事情。等等。

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

编辑:正如@chux指出的那样,您的CHARLEN也太小了。将其设置为80,以便您的字符串有79个字符的空间以及必要的空终止符。

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

我的英文很差,希望代码能帮助你!