2017-09-15 59 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; 
} 

我的英文很差,希望代碼能幫助你!