1

私はまだ C を学んでおり、これを処理する方法を理解するのに苦労しています。さて、私は2つの構造体を持っています:

struct myStruct {
    ...
    struct myString *text[5];
    ...
} allStructs;

struct myString {
    char part[100];
};

目的は、allStruct[n]それぞれ 100 文字の行に分割されたテキストの 5 つの異なる部分を指すようにすることです。だから私はスペースを割り当てます:

allStructs = calloc(n, sizeof(allStructs));

char text[500]次に、 5 つの部分に分割したい塗りつぶしがallStructs[n].text[n].partあり、テキストの特定の部分にポイントがあるとします。誰でも私がどのように進めるかを手伝ってもらえますか?

4

3 に答える 3

1

短い答え: '\0' 文字が各文字列を終了することを考慮していないため、これを使用することはできません。

より長い答え: そのような構造体を変更して、柔軟性を高めます:

struct myStruct {
   struct myString *text;
}
struct myString {
   char *part;
}

割り当ては次のようにする必要があります。

struct myStruct *allStruct = calloc(n, sizeof(struct myStruct));

したがって、n struct myStruct にポインター/配列があります。

次に、allStruct のすべてのメンバーを初期化します。

for( i=0; i<n; ++i )
{
   allStruct[i].text = calloc(5, sizeof(myString));
   // Following for only needed if you want new strings by using the strncpy (see above)
   for( y=0; y<5; ++y )
   {
      allSTruct[i].text[y].part = calloc(101, sizeof(char));
   }
}

これで、すべての変数が初期化されました。

500 文字の長い文字列を allStruct[n] にコピーするには:

for( i=0; i<5; i++ )
{
   allStructs[n].text[i].part = &text[i*100]; // If you want to point on the existing string
   // OR
   strncpy(allStructs[n].text[i].part, &text[i*100], 100); // If you want to have new strings

   // In all case, terminate the string with '\0'
   allStructs[n].text[i].part[100] = '\0';
}

これはうまくいくはずです。

于 2009-10-08T17:47:52.797 に答える
0

ええと、c文字列はヌル文字('\0')で終わる文字の配列にすぎません。したがってtext[500]、各部分に100文字を入れて、大きな配列を反復処理する必要がありmyStringます。c文字列はnullで終了するため、に格納できるのは99文字のみであることに注意してchar part[100]ください。

また、空白文字(スペース(' ')、改行('\n')、またはタブ('\t'))の一部のみを終了する場合は、100文字の制限に最も近い文字を見つけて、そこで文字列を分割する必要があります。

于 2009-10-08T17:41:47.677 に答える
0

allStructsタイプのオブジェクトですstruct myStruct。で「再割り当て」することはできませんcalloc()

オブジェクトには、5 つのポインターの配列であるallStructsメンバーがあります。 タイプの特定のオブジェクトを指すようにこれらのポインターを設定する必要があります。text
struct myString

char text[500]からさまざまなオブジェクトに文字をコピーstruct myStringすると、すべてが正しく機能します。

疑似コード

struct myString part1;
struct myString part2;
struct myStruct allstructs;
allStructs.text[0] = &part1;
allStructs.text[1] = &part2;
strncpy(part1.part, text, 99);
part1.part[99] = '\0';

printf("part2: %s\n", allStructs.text[1].text);

おー!allStructs('s' で終わる) とallStruct('s' がない) を混同しないでください。

于 2009-10-08T17:52:01.523 に答える