2017-09-15 5 views
0

.txtファイルから入力を受け取り、charポインタの配列に単語を格納し、単語の長さを平均し、平均を超える単語を出力するCプログラムを作成しようとしています。長さ今私は印刷機能(print_array)を取得しようとしている、私はこれを再帰的にやりたい何らかの理由で、print関数が配列のすべての要素を出力していない場合は、最初の要素を印刷し、毎回最初の文字を削除するだけです。私はここで間違って何をしていますか?乾杯配列を再帰的に出力して奇妙な出力を生成する

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

ここでは、1つのCの文字列を取り、nがゼロでない場合、(&a[0]a自体と同じになってしまうであろう配列の最初の要素へのポインタである)、それを印刷します。次に、Cの文字列ポインタに1を加えて、2番目の文字から同じことをします。等々。解決方法:C文字列の配列を印刷する場合は、print_array関数を個々の文字列だけでなく、配列全体を使用するようにします。 char *ではなくchar **になります。次に&print_arrayに、*print_arrayという行に取り除いてください。

編集:@chuxによって指摘されているように、CHARLENも小さすぎます。あなたの文字列が79文字と必要なヌルターミネーターのためのスペースを持つように80にしてください。

2

引数*wordlistは、*wordlist[]の最初の要素へのポインタですが、2次元配列を印刷します。だから、コードは次のようになります。

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

私の英語が悪い、コードはあなたを助けることを願って!