2011-11-26 67 views
1

我在C中使用strtok時遇到了問題。我使用fgets從命令行獲取用戶輸入,我想用管道(「|」)作爲分隔符對其進行標記,並將結果放入雙指針變量。這裏是我的代碼:在C語言中使用strtok

char** argv; 
char *token; 
token = strtok(userInput, "|"); 
while(token != NULL){ 
    *(argv++) = token; 
    token = strtok(NULL, "|"); 
} 

*argv = '\0'; 

然後我用這個代碼來驗證它是否以及標記化

while(*argv!= NULL) 
{ 
    if((strcmp(*argv, "|") == 0){ 
    count = count + 1; 
    } 
    argv++; 
} 
printf("%d pipes", count); 

但它不工作。 char ** argv不包含任何內容。代碼的執行停止並返回-1。當我嘗試打印argv時,argv不包含任何值。

有什麼想法嗎?謝謝。

編輯:

我想要做的就是這個

userInput = "abc|cde"; 

使用的strtok後。我想有一個** argv的

**argv = "abc"; 
+0

*,但它不工作*到底會發生什麼? – Dennis

+0

當你說它不起作用時,你會得到什麼錯誤? –

+0

「不起作用」是什麼意思?該代碼完全符合您的要求。這可能與您所期望的不同,但不可能猜測您是否不願意告訴我們。 –

回答

0

你的符號化的代碼是這樣的:如果

userInput = "a|b|c" 

然後

argv = { "a", "b", "c" } 

你可能期待的是

argv = {"a","|","b","|","c"} 

你的代碼coun牛逼的管道應該是:

while(*argv != NULL) 
{ 
    count = count + 1; 
    argv++; 
} 
printf("%d pipes", count-1); 

我認爲它會工作

+0

這有點接近我想要的。其實我想要的是:如果我有一個userInput像'{a b | c^d NULL}',我想'字符** argv的= { 「A」, 「B」,NULL}' – mkab

+0

請檢查我的編輯問題 – mkab

+0

你說,你只是想字串前面第一個 '|'分隔符。 ?? – anshul410

2

的一個問題是,你似乎並不被初始化argv。你需要分配足夠的內存來容納儘可能多的char *s。否則,你正在寫一些隨機的內存塊。 (難道你只是沒有向我們顯示相關的代碼?)

另一個問題是,你實際上修改argv,所以在該循環結束時,它指向一個過去的最後一個標記(然後你設置爲*argvNULL);但您的驗證碼假定它指向第一個令牌,並從確認*argv而不是NULL開始。 (難道你沒有向我們展示一些相關的代碼嗎?)編輯補充:我從上面的評論中看到「argv不包含任何值」。我很有信心,這個是原因。順便說一下,你很難將'\0'(空字節)與NULL(空指針)混淆。從技術上講,這可以正確地解決— '\0'得到提升00得到轉換爲NULL —但我覺得有點令人擔憂,你混淆他們,因爲從概念上說他們是完全不同的。你應該寫*argv = NULL而不是*argv = '\0',爲了清楚起見,如果沒有別的。

+0

請檢查我編輯的問題 – mkab

0

我正在使用的是用於搜索300x400的這種格式。尋找「x」擺脫x並使用雙方,300和400。這對我有用。

char *tok1, *tok2, *saveptr; 

tok1 = strtok_r(argv, "x", &saveptr); 
tok2 = strtok_r(NULL, "x", &saveptr); 

printf("this tok1 %s this is tok2 %s\n", tok1, tok2); 

使用strtok_r功能

0

的問題是當你試圖從它導致你的argv並不指向第一個元素。這裏發生

問題: *(argv的++)=記號

的argv(指針爲char *)時加令牌指針argv數組(I假設你已經正確初始化它)增加。所以當你使用代碼的第二部分來得到結果時,argv已經指向最後一個元素,在你的情況'\ 0'中,它不會產生任何輸出。

而且,你將'\ 0'與NULL混合在一起,儘管它們在語法上都是正確的,但是在你的情況下使用NULL會更好,因爲它意味着一個指針,但'\ 0'意味着null C-串

您可以將您的代碼更改爲以下:

/* Init argv array */ 
char** argv; 
size_t argc=0; // token count 
char *token; 
token = strtok(userInput, "|"); 
while(token != NULL){ 
    argv[argc++] = token; 
    token = strtok(NULL, "|"); 
} 
argv[argc] = NULL; // the last element of argv array is a NULL pointer 

/* get result from argv */ 

while(*argv!= NULL) 
{ 
    if((strcmp(*argv, "|") == 0){ 
    count = count + 1; 
    } 
    argv++; 
} 
printf("%d pipes", count);