1

strtokとstrcatを使用しようとしていますが、2番目のprintfが表示されません。コードは次のとおりです。

int i = 0;
char *token[128];
token[i] = strtok(tmp, "/");
printf("%s\n", token[i]);
i++;
while ((token[i] = strtok(NULL, "/")) != NULL) {
    strcat(token[0], token[i]);
    printf("%s", token[i]);
    i++;
}

tmpの入力が1/2/3/4/5/6の場合、コンソール出力は13456になります。2は常に欠落しています。誰かがこれを修正する方法を知っていますか?

4

2 に答える 2

3

ループの最初の反復でstrcatの呼び出しで上書きするため、この2つは常に欠落しています。

ループに入った後、バッファには次のものが含まれます: "1 \ 02\03/4/5/6"内部strtokポインタは"3"を指しています。tokens[1]は「2」を指します。

次に、strcat: "12 \ 0 \ 03/4/5/6"を呼び出して、token[i]ポインターが"\0"を指すようにします。最初の印刷では何も印刷されません。

ヌル文字は入力データを上書きしないため、後続の呼び出しは問題ありません。

これを修正するには、解析しているバッファではなく、2番目のバッファに出力文字列を構築する必要があります。

動作中の(?)バージョン:

#include <stdio.h>
#include <string.h>
int main(void)
{
    int i = 0;
    char *token[128];
    char tmp[128];
    char removed[128] = {0};
    strcpy(tmp, "1/2/3/4/5/6");
    token[i] = strtok(tmp, "/");
    strcat(removed, token[i]);
    printf("%s\n", token[i]);
    i++;
    while ((token[i] = strtok(NULL, "/")) != NULL) {
        strcat(removed, token[i]);
        printf("%s", token[i]);
        i++;
    }
    return (0);
}
于 2011-09-14T16:47:12.907 に答える
0

strtok所定の位置にある入力文字列を変更し、その文字列へのポインタを返します。次に、それらのポインターの1つ( )を取得し、そのポインターに書き込むtoken[0]別の操作()に渡します。strcat書き込みは互いに混乱しています。

すべてのトークンを連結する場合は、に個別のを割り当てる必要がありchar*ますstrcpy

于 2011-09-14T16:45:23.360 に答える