2011-09-14 14 views
1

私はstrtokとstrcatで作業しようとしていますが、2番目のprintfは決して表示されません。ここでは、コードは次のようになります。StrtokとStrcatの競合

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が常に不足しているだろう。誰もがこれを修正する方法を知っていますか?

答えて

3

ループの最初の反復では、strcatの呼び出しで上書きされるため、2つは常にありません。

ループに入ると、バッファに "1 \ 02 \ 03/4/5/6"が含まれます。内部strtokポインタが "3"を指しています。トークン[1]は「2」を指しています。

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

ヌル文字が入力データを上書きしないため、それ以降の呼び出しはOKです。

出力文字列を修正するには、解析しているものではなく、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); 
} 
0

strtokは、入力文字列を所定位置に変更し、その文字列へのポインタを返します。それらのポインタ(token[0])の1つを取り出し、そのポインタに書き込む別の操作(strcat)に渡します。書き込みはお互いにぶつかり合っています。

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