2011-09-14 94 views
1

我正在嘗試使用strtok和strcat,但第二個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++; 
} 

如果我輸入1/2/3/4/5/6的TMP則控制檯輸出將是13456. 2.總是缺少。有誰知道如何解決這一問題?

回答

3

這兩者總是缺失,因爲在循環的第一次迭代中,您會用調用strcat覆蓋它。

進入循環後,緩衝區包含:「1 \ 02 \ 03/4/5/6」內部strtok指針指向「3」。令牌[1]指向「2」。

然後,您調用strcat:「12 \ 0 \ 03/4/5/6」,因此您的令牌[i]指針指向「\ 0」。第一個打印什麼都不打印。

後續調用是可以的,因爲空字符不會覆蓋輸入數據。

要修復它,你應該建立你的輸出字符串到第二個緩衝區,而不是你正在解析的。 (?)

工作版本:

#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])並將其傳遞給寫入該指針的另一個操作(strcat)。寫作是互相扯皮。

如果你想連接所有的標記,你應該分配一個單獨的char*strcpy