1

この方法で文字列の配列を初期化できることはわかっています。

static const char *BIN_ELEMENTS[5] = {
    "0000\0",           // 0
    "0001\0",           // 1
    "0010\0",           // 2
    "0011\0",           // 3
    "0100\0",           // 4
};

しかし、私はそれを動的な方法で達成する必要があります。ファイルから文字を読み取り、配列に挿入します。次に、その配列を文字列の配列にコピーします (上記のように)。

ファイルから次の文字をキャプチャし、次のように配列に挿入したとします。

char number[5];
char *listOfNumbers[10];
number[0]='1';
number[1]='2';
number[2]='3';
number[3]='4';
number[4]='\0';

ここで、number の内容全体を // にコピーしたいと思います。これは、listOfNumers[0]"1234" を listOfNumers の位置 0 に格納したことを意味します。異なる数値を格納するために、さらに 9 つの位置を残します。

だから私はこのようなことをします:

listOfNumers[0] = number; //this actually seems to work.

しかし、数字の巨大なファイルであるため、新しい数字を抽出するには、配列番号を再利用する必要があります。しかし、それを行うと、以前に listOfNumers[0] に保存されていたコンテンツが上書きされ、新しい番号の新しい位置が更新されました。どうすれば対処できますか?

これが私がこれまでに持っているものです:

char number[5]; // array for storing number
int j=0;        // counter
int c;          // used to read char from file.
int k=0;        // 2nd counter
char*listOfNumbers[10]; // array with all the extracted numbers.
FILE *infile; 

infile = fopen("prueba.txt", "r");

if (infile) {
    while ((c = getc(infile)) != EOF) {
        if(c != ' ' && c != '\n') 
            number[k] = c;
            ++k;
        } // end inner if
        else {
            number[k] = '\0';
            listOfNumbers[j] = number;
            printf("Element %d is: %s\n", j, listOfNumbers[j]); // prints correct value
            ++j;
            k=0;
        } // end else

    } // end while
    fclose(infile);
} // end outer if

printf("\nElement 0 is: %s\n", listOfNumbers[0]);  // fails - incorrect value
printf("Element 1 is: %s\n", listOfNumbers[1]);    // fails - incorrect value
printf("Element 2 is: %s\n", listOfNumbers[2]);    
4

2 に答える 2

1

char *listOfNumbers[10]; char への 10 個のポインタ用にメモリを予約するだけです。また、listOfNumbers[j] = number は、配列番号のアドレスのみを格納します。配列番号の内容はコピーしません。番号 addrs は決して変わらないため、「リスト」の 10 個の要素のそれぞれが同じ空間を指します。

スペースを予約するには、listOfNumber の 10 個の要素ごとに malloc を使用する必要があります。number の内容を現在の listOfNumber[k] にコピーするには、strcpy を使用する必要があります。

listOfNumber[k] = malloc(strlen(number)+1);  // reserve space of len 
strcpy(listOfNumbers[k],number) // copy string 

最後に listOfNumbers の各要素を解放することを忘れないでください...また、ファイルに10を超える文字列が含まれている可能性があることに注意してください...

于 2013-08-31T21:58:07.170 に答える
0

あなたがやっていることは、5 つcharの s のバッファを取得し、そのアドレス ( a in にnumber減衰) を取得し、10 の配列に格納することです。もちろん、これはやりたいことではありません。最終的には、すべてのエントリが同じバッファを指し、元のメモリが失われるからです。char*listOfNumers[0] = number;char*listOfNumbers

この問題に取り組むには 2 つの方法があります。

  1. strcpy()H2CO3 が示唆するように使用してください。

  2. 動的メモリ割り当てを使用します。glibc を使用していてasprintf、割り当て拡張機能scanfがあなたの友人である場合 (これは POSIX 2008 です)。

一般的に、私は常に固定長バッファを使用しないことをお勧めします: あなたが課した制限がもはや要件に適合しなくなる時が来ることを保証できます.そして、あなたは拡張されたバグハンティングパーティーに参加しています...そしてそれらの割り当て関数本当に生活を楽にします。

于 2013-08-31T21:53:48.177 に答える