2016-12-04 22 views
1

"Cプログラミングの現代的アプローチ第2版"の問題から取り組んでいます。私は最小と最大の単語を書くプログラムを書いてみたい。ユーザーが4文字の単語を入力すると、プログラムは入力の受け入れを停止します。文字列を配列に格納するC

私はこれを解決するために文字列の配列を使用していますが、私はそれに単語を格納する私のプログラムを得ることさえできません。

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

#define WORD_LEN 20 

int main() 
{ 
    char word[WORD_LEN]={0},ch; 
    char *a[10]={};   //Max 10 words in the array 
    int i=0,j; 

    for(;;) 
    { 
     printf("Enter a word: "); 
     fgets(word,WORD_LEN,stdin); 
     strtok(word, "\n");    //removes newline 

     a[i] = word; 
     if(strlen(word) == 4)   //if word is 4 characters 
      break;      //break out of loop 

     i++; 
    } 

    for(j=0;j<i;j++)      //displaying array 
     printf("%s\n",a[j]); 

    return 0; 
} 

出力:

Enter a word: Analysis 
Enter a word: Martin 
Enter a word: Jonathan 
Enter a word: Dana 
Dana 
Dana 
Dana 

私が間違ってやっているものに任意のアイデア?ありがとう。

+2

'[i]の単語を=;':あなたは、[i]は ''にword' 'の同じADDRESを設定します – BLUEPIXY

答えて

2

BLUEPIXYが言及したように、あなたはすべての[i]に同じアドレスを格納しています。だから、ループの終わりに、最後の出力をi回印刷します。

解決方法: [i]にメモリを割り当てて文字列をコピーする必要があります。他の人の答えに追加

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

#define WORD_LEN 20 
#define MAX_NUM_WORD 10 //Max 10 words in the array 

int main() 
{ 
    char word[WORD_LEN]={0},ch; 
    char *a[MAX_NUM_WORD]={0};    
    int i=0,j; 

    for(;;) 
    { 
     printf("Enter a word: "); 
     fgets(word,WORD_LEN,stdin); 
     strtok(word, "\n");    //removes newline 

     a[i] = malloc(sizeof(char)* (strlen(word)+1)); //1 for '\0' 

     strcpy(a[i], word); 

     i++; 
     if(strlen(word) == 4)   //if word is 4 characters 
      break;      //break out of loop 

     //i++; //You will be missing last 4 letter word if i++ is here. 
     if(MAX_NUM_WORD <= i) //You can store only MAX_NUM_WORD strings 
      break; 
    } 

    for(j=0;j<i;j++)      //displaying array 
     printf("%s\n",a[j]); 

    //Your other code. 

    for(i=0; i<MAX_NUM_WORD && NULL != a[i]; i++) 
     free(a[i]); //Free the allocated memory. 

    return 0; 
} 
1

あなたの文字列にメモリを割り当てるためにmallocを使用した場合、また、そこから返されたvoid*ポインタの戻り値をチェックするのが良いです。

さらに、超安全であるように、戻り値fgetsを確認することも安全です。

このソリューションは、これらのポイントを示しています

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

#define WORD_LEN 20 
#define MAX_NUM_WORD 10 
#define EXIT_LEN 4 

int 
main(void) { 
    char word[WORD_LEN]; 
    char *a[MAX_NUM_WORD]; 
    int i = 0, wrd; 

    while (i < MAX_NUM_WORD) { 
     printf("Enter a word: "); 
     if (fgets(word, WORD_LEN, stdin) != NULL) { 
      word[strlen(word)-1] = '\0'; 
     } 

     a[i] = malloc(strlen(word)+1); 
     if (a[i] == NULL) { 
      fprintf(stderr, "%s\n", "Malloc Problem"); 
      exit(EXIT_FAILURE); 
     } 

     strcpy(a[i], word); 

     i++; 

     if (strlen(word) == EXIT_LEN) { 
      break; 
     } 

    } 

    // Print and free, all at once. 
    for (wrd = 0; wrd < i; wrd++) { 
     printf("%s\n", a[wrd]); 
     free(a[wrd]); 
     a[wrd] = NULL; 
    } 

    return 0; 
} 
関連する問題