1

基本的に、空白が発生するたびに、ユーザー入力を char 配列 (ソース) の配列に連結しようとしています。つまり、sourceHold に「happy birthday to you」が含まれている場合、sources の配列の内容は、「happy」(0 の場合)、「birthday」(1 の場合)、「to」(2 の場合)、「you」(2 の場合) になります。 3)。sourcesTag は、char 配列の配列の現在のインデックスを保持します。ループを終了するとエラーが発生し続けます (コードは、ループを完全に終了する前に常に中断します。最後の「LOOP EXIT」印刷行は印刷されません。何が間違っているかをテストするためにそこに配置されました。ループが終了しない理由はありますか? imこれは、入力文字列全体がトークン化されたときに while ステートメントが適切に終了しないためだと推測していますが、適切なステートメントは何でしょうか?

while(sourceHold != NULL)
    {
        if(sourceHold[0] == '\n')
            break;

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

        strcpy(sources[sourcesTag], strtok(sourceHold, " "));
        sourcesTag++;

        strcpy( sourceHold, strtok(NULL, "\n"));
    } 
    printf("LOOP EXIT");
4

2 に答える 2

5
while(sourceHold != NULL)

ループ内の何も変更さsourceHoldれず、

strcpy( sourceHold, strtok(NULL, "\n"));

breaking条件が

if(sourceHold[0] == '\n')

は(ある場合) を でstrtok上書きするため、満たされることはありません。'\n''\0'

はい、無限ループがあります。チェックsourceHold[0] != 0を追加すると修正されます。

ただし、ポインターを持っている方が良いでしょう

char *tok = strtok(sourceHold, " ");
while(tok != NULL) {
    strcpy(sources[sourcesTag++], tok);
    tok = strtok(NULL, " \n");
}

疑わしいことを避けるためにstrcpy(sourceHold, strtok(NULL, "\n"));

于 2012-11-09T16:49:00.820 に答える
0

man ページを見てください。

strtok() の最初の呼び出しでは、解析する文字列を str で指定する必要があります。同じ文字列を解析する必要がある後続の各呼び出しでは、str は NULL である必要があります。

sourceHold で 1 回呼び出す必要があり、その後、他のすべての呼び出しは NULL で呼び出す必要があります。おそらく次のようなものです:

    strcpy(sources[sourcesTag], 
           strtok(0 == sourcesTag ? sourceHoldPtr : NULL, " "));
    sourcesTag++;
于 2012-11-09T17:11:34.703 に答える