2017-10-07 12 views
2

C言語のポインタ配列の動的割り当てに関する助けが必要です。私は、ユーザ入力から単語の文を読み込んで文字配列文字列に格納するプログラムを作成しようとしています。私はポインタchar **wordArrayの配列のこれらの単語にポインタchar *wordを保存したいと思います。ユーザ入力からのポインタの動的配列

単語の動的割り当てのための作業方法を作成するのは簡単で、ユーザー入力から文字を読み込みます。しかし、ポインタの配列にこのメソッドを適用しようとすると、やりにくくなりました。

現在の関数char **varArrayには明らかな欠陥がありますが、私の考えは「ユーザーが入力している間にポインタの配列の単語ポインタを取得しています」でした。今度は、char cごとに最初の単語を効果的にループします。

私の質問は、私のポインタの配列の動的メモリ割り当ての2番目の層(char **varArray())を実装するのですか?どのようにしてchar *word()に電話をかける機能を検出できますか?

コード、スタイル、またはその他のエラーのフィードバックは、もちろん評価されます。私のレベルは中級の初心者です。

/*CREATES AND ALLOCATES DYNAMIC VARIABLE ARRAY*/ 
#include <stdio.h> 
#include <stdlib.h> 

char **varArray(); 
char *word(); 

char **varArray() 
{ 
    char **tmp=NULL; 
    char **wordArray=NULL; 
    size_t size=0; 
    char c = EOF; 
    int words=0; 

    while(c) { 
    c=getc(stdin); 
    if (c == EOF || c == '\n') 
     c=0; 

    if (size <= words) { 
     size+=sizeof(char *); 
     tmp = realloc(wordArray,size); 

     if(tmp == NULL) { 
     free(wordArray); 
     wordArray=NULL; 
     printf("Memory allocation failed. Aborted.\n"); 
     break; 
     } 

     wordArray=tmp; 
    } 
    words++; 
    wordArray[words]= word(); 
    return wordArray; 
    } 

ONE単語を検索する方法:

/*GETS ONE WORD FROM USER INPUT*/ 
    char *word() 
{ 
    char *word=NULL, *tmp=NULL; 
    size_t size=0; 
    char c = EOF; 
    int letters=0; 

    while(c) { //reads character by character 
    c=getc(stdin); 

    if (c == EOF || c == '\n' || c==' ') //remove ' ' to read all input 
     c =0; 

    if (size <= letters) { //increase and reallocate memory 
     size = size + sizeof(char); 
     tmp = realloc(word,size); 

     if (tmp==NULL) { //check if allocation failed 
     free(word); 
     word=NULL; 
     printf("Memory allocation failed. Aborted.\n"); 
     break; 
     } 
     word= tmp; 
    } 
    letters=letters+1; 
    word[letters]=c; 

    } 
    /*ADD SENTINEL CHARACTER*/ 
    letters++; 
    size += sizeof(char); 
    word = realloc(word,size); 
    word[letters]='\n'; 
    return word; 
} 
+0

詳細:コードは_line_( ' '\のn''へ文字まで)を読み込んでいるように見えない[文](https://でENを.wikipedia.org/wiki/Sentence_(言語学))。 – chux

+0

ステップ1: 'char c = EOF;' - > 'int c = EOF;' – chux

+0

正しいです、それは行を読み、私はその目的を伝えようとしていました:実用的に。 – waahlstrand

答えて

1

はここでは書きたいプログラムのスケルトンです。

... 
    char* currentWord; 
    char **wordArray=NULL; 
    while ((currentWord = word()) != NULL) { 
     .... add current word to word array with realloc... 
    } 
.... 

char* word() { 
    int ch; 
    char* outputWord = NULL; 
    while ((ch = getch()) != EOF) { 
     if (... ch is a word character ...) 
      ... add ch to output word with realloc ... 
     else { 
      char* ret = outputWord; 
      outputWord = NULL; 
      return ret; 
     } 
    } 
    return NULL; 
} 

2つのwhileループがまったく同じことをしていることに注意してください。

while ((element = getNextElement()) != sentinelValue) { 
     .... process newly obtained element .... 
    } 
+0

ありがとう、@ n.m。私は概念的な概要に感謝します。私はそれを正しく理解している場合、内側のループは、スペースを言うまで、単語の文字を蓄積する必要がありますか? しかし、私は古いコードを推論するのにちょっと戸惑っています。外側のループはどのようにすべての文字をループしませんか?もしそうなら。 – waahlstrand

+0

はい内部whileループはあなたの言うように単語の文字を蓄積するはずです。私の外側のループは個々の文字を表示しません、それは単語をループします。それはあまりに複雑なので、あなたのことは理由を考えるのは少し難しいです。あなたはおそらくそれを続行したくないでしょう。 –

0

これで、@ n.mによって提供されたシェルのバージョンが正常に実装されました。しかし、別の問題が発生しました。word()は、センチネル改行文字\nに依存して終了するため、最後の単語を読み込むことができず、最後の重要な時刻にループに入りません。

私はいくつかのif-caseを実装しようとしましたが、while-conditionのためにこれらはもちろん失敗します。もう1つの考え方は、いくつかのスイッチケースを実装することですが、whileループの不快感を避けることはできませんか?

混乱を最小限に抑えるために、コードにはほとんどエラーがないことに注意してください。

char **wordArray() { 
    char *currentWord; 
    char **wordArray=NULL; 
    size_t size=0; 
    int i=0; 

    while((currentWord = word()) != NULL) { 
    size+=sizeof(char *); 
    wordArray=(char **) realloc(wordArray,size); 
    wordArray[i]=currentWord; 
    printf("Test - Current word: %s\n",currentWord); 
    i++; 

    } 
    return wordArray; 
} 

関連word()機能:

char *word() { 
    char ch; 
    int i=0; 
    size_t size=0; 
    char *returnWord = NULL; 
    char *outputWord = NULL; 
    char *tmp = NULL; 

    while((ch = getc(stdin)) != EOF && ch !='\n') { //&& ch !='\n' 
    if (ch != ' ') { //&& ch !='\n' 
     size += sizeof(char); 
     tmp = (char *) realloc(outputWord,size); 
     outputWord= tmp; 
     outputWord[i]=ch; 
     printf("Test1: %c\n",*(outputWord+i)); 
     i++; 
    } else { 
     printf("Test2: %s\n",outputWord); 
     returnWord=outputWord; 
     outputWord=NULL; 
     printf("Test3: %s\n",returnWord); 
     return returnWord; 
    } 
    } 
    return NULL; 
} 
関連する問題