0

ファイルを読み込んで、各文字を配列に追加しています。次に、スペースやその他の重要でない文字を削除して、これらの文字を単語に分解します。ここで、各単語を個別に操作するために、各単語を独自の配列に追加したいと思います。これを行う方法はありますか?各単語の先頭のメモリ位置を追加しようとしましたが、配列の先頭のメモリ アドレスが引き続き表示されます。問題は、以下のコードでは、「buffer」という名前の変数が、while ループの反復ごとに新しい単語で上書きされることです。リンクされたリストにプッシュするには、各単語を参照できる必要があります。これが私がこれまでに持っているものです:

#include <stdio.h>
#include <ctype.h>

int main(int argc, char **argv) {
char buffer[1024];
int c;
size_t n = 0;

FILE *pFile = stdin;

pFile = fopen(argv[1], "r");
if (pFile == NULL) perror("Error opening file");
    else {
        while(( c = fgetc(pFile)) != EOF ) {

            if (isspace(c) || ispunct(c)) {

                if (n > 0) {
                    buffer[n] = 0;
                    printf("read word %s\n", buffer);
                    n = 0;
                }
            } else {
                buffer[n++] = c;
            }
        }
        if (n > 0) {
            buffer[n] = 0;
            printf("read word %s\n", buffer);
        }
        fclose(pFile);
    }
return 0;
}

「これは、この演習の単語を保持するテスト ドキュメントです」という文字を含むファイルを指定すると、次のようになります。

read word This
read word is
read word a
read word test
read word document
read word that
read word holds
read word words
read word for
read word this
read word exercise
4

3 に答える 3

1

読んだ文字列を保存するだけでよい場合は、strdupman strdup詳細については)を使用してバッファのコピーを作成し、前述のようにポインタを配列またはリンクリストに保存できます。

strdup使用mallocして各文字列にストレージを割り当てることに注意してください。文字列が不要になったら、このメモリを自分で解放する必要があります。mallocまた、多くの小さなメモリ ブロックを割り当てるために繰り返し使用すると、コストがかかる可能性があるため、注意して使用してください。

于 2013-03-30T11:30:10.530 に答える
1

いいスタートが切れたようですね。あなたがしていることは、すべての単語を一度に 1 つずつ 1 つの配列に正常に読み取り、毎回上書きすることです。

問題は、以下のコードでは、「buffer」という名前の変数が、while ループの反復ごとに新しい単語で上書きされることです。

確かに、そうします:

     if (n > 0) {
           buffer[n] = 0; // this line terminates each string
           printf("read word %s\n", buffer);
           n = 0;         // this line resets the array so you overwrite with the next
                          // word
     }

したがって、この時点では、これらの単語を上書きするのではなく、リンクされたリストに配置するだけで済みます。それらをすべて配列に格納することもできます (十分な長さの場合)。この時点で本当に行う必要があるのは、次の行を置き換えることです。

printf("read word %s\n", buffer);

リンクされたリストに単語を追加するコードを使用します。基本的に、ある種の「ノード」構造が必要です。最も基本的な意味では、次のようなことを行う必要があります。

struct node{
   char * word;       // place to add the word
   struct node *next; // pointer to the next node
};

次のコードは、リンクされたリストの最初のノードを指しているヘッド ノードがあり、現在のノードへのポインターがあることを前提としています。頭から始まります:

cur->next = malloc(sizeof(node));          // assign memory for a new node
cur = cur->next;                           // move current to the next node
cur->word = malloc(sizeof strlen(buffer)); // assign memory for the word
cur->next = NULL;                          // set the next pointer to NULL
strcpy(cur->word, buffer);                 // copy the word from the buffer 
                                           //   to your list
于 2013-03-30T15:03:10.497 に答える
1

buffer依然としてポインターです。つまり、ポインター演算が適用されます。単語の終わりに出くわすたびに0内側に書き込みます-これは良いことです. buffer次の単語を別の配列に入れるために必要なことはbuffer、次の空いている位置に早送りするだけです。

buffer += n;

見栄えを良くするために、n完全に破棄し、buffer++どこでも持って、単語の次の文字をコピーすることができます*buffer = c.

次に、すべての単語が独自の配列に配置され、重複しません。単語の先頭へのポインターを使用して、リンクされたリストに格納できます。従来の文字列関数 (strlen など) を使用することができ、それらの出力はメモリ内で文字列が連続してパッキングされることはありません。0保存されているすべての単語の最後に追加したため、これが可能です。

于 2013-03-30T11:36:54.230 に答える