1

私は2つの配列を手に入れました:

data[256] = "1@2@3@4@5"
question[256][256];

の前の数値を@配列に分割する必要があります。例:

question[0][] = 1
question[1][] = 2
question[2][] = 3
question[3][] = 4
question[4][] = 5

私が入っているかどうかはわかり@ません。

これは私が書いたものです:

int i = 0, j = 0;
 data = "1@2@3@4@5";

 for (i = 0 ; i < strlen(data) ; i++)
 {
     for (j ; data[j] != '@' ; j++)
     {
         question[i][j] = data[j];
     }
     j++
 }

 printf ("%s\n", question);

問題は、最初のまで動作し@、その後停止することです。最初のものだけ@を問題にし、その後停止します。(基本的に、両方のデータと質問を印刷するために同じ出力を取得することになっています)。

4

3 に答える 3

2

いくつかの問題があります。

最初にprintf、最初の終端ゼロ文字 ( '\0') までの文字列のみを出力します。これは、最初の「部分」の後に発生しquestionます (他の部分がある場合でも)。代わりに、すべてを出力する必要があります。

for (i=0; i<255; ++i) {
  printf("%s\n", question[i]);
}

初期化されていない行のガベージを出力しないように、必ず前'\0'の行をヌル終了 ( ) してください。questionまたは、最後に有効な行のインデックスを維持し、それまで繰り返します

また、ループ

for(j; data[j]!='@', j++)

は最初の で停止し、'@'その後の外側のループの反復はすべて同じと評価されますj(これは のインデックスであるため、以降の反復ではループはスキップされます。内側のループの後'@'に進む必要があります)。j

また、 last-からの位置を計算できるように、 last の後にlast- jpositionを維持する必要があるため、適切にインデックスを付けることができます。afterの値に設定すると、前の段落で提案された追加の進歩です。また、 の 2 番目のインデックスはこれからである必要があります。'@'j'@'question[i]lastjjquestionj-lastj

内側のループに関するさらに別のこと: そのままでは、data最後の の後に文字列を超えて進む'@'ため、noll 終了も確認する必要があります。

また、 の文字列を null で終了していることを確認してくださいquestion。そうしないprintfと、ガベージが生成されます (プログラムに割り当てられていないメモリに到達すると、セグ フォールトが発生する可能性があります)。書くだけ

question[i][j-lastj] = '\0';

内側のループの後。(j内側のループの最後に最後に書き込まれたインデックスの後にポイントされます)

さらにもう 1 つ:iの長さまで反復しないでください。それほどdata多くの要素に触れる必要はありません (data内側のループでオーバーインデックスが発生する可能性があります)。while代わりにループを使用し、内側のループでカバーするiまでのみインクリメントしますdataj

strtokあなたの側でトークン化をより簡単にするために調べてください

于 2012-06-14T10:52:13.273 に答える
0

strchr次の場所を取得するようなものを使用し'@'ます。

アルゴリズムは次のようなものです。次の の位置を取得し、'@'見つからない場合nextは文字列の末尾に設定します。beginning次に、現在の文字列から必要な場所にコピーしnextます。コピーした文字列を終了することを忘れないでください! beginning文字列の を 1 を超えた値に設定しますnextbeginningがデータの終わりを超えるまで繰り返します。

編集:私のソリューションのコード:

char *beg = data;
char *end = data + strlen(data);  /* Points to one beyond the end of 'data' */

for (int i = 0; beg < end; i++)
{
    char *next = strchr(beg, '@');  /* Find next '@' */
    if (next == NULL)
        break;  /* No more '@' */

    memcpy(question[i], beg, next - beg);  /* Copy to array */
    question[i][next - beg] = '\0';  /* Remember to terminate string */

    beg = next + 1;  /* Point to next possible number */
}

注: テストされていません。コピーとの 1 つかもしれないし、そうでなければならないかもしれませんnext - beg - 1。(25 年間の C プログラミングの後でも、私はいつも最初の試みでそれを間違えているようです... :))

于 2012-06-14T11:01:42.887 に答える
0

これを行うには、もっと簡単な方法があります。を使用strtokして文字列をトークン化し、"@"を使用してトークン化された文字strcpy列を配列にコピーしますquestion。例(テストされていません):

char *pcur = data;
int i = 0;

do
{
  if ((pcur = strtok(pcur, "@")) != NULL)
  {
    strcpy(question[i], pcur++);
    printf ("%s\r\n", question[i++]);
  }
}
while (pcur != NULL);

上記の例に示すように、インクリメントiquestion配列インデックスを次の位置にpcur移動し、インクリメントはトークン化された文字列ポインターをループの次の反復のために null トークンを超えて移動します。

以下も参照してください。

于 2012-06-14T13:52:12.330 に答える