2012-04-27 92 views
-1

我正在寫一個C程序,用戶可以在其中輸入一個1-3位數字後跟一個反斜槓,然後另一個1-3位數字或他們可以輸入1-3位數字,然後一個逗號,然後是另一個1-3位數字,並且它可以迭代多少次沒有限制。C多個Strtok來確定分隔符

我需要確定輸入分隔符是否是反斜槓或逗號(以確定如何處理數字)並將數字放入數組中。

我想這樣做的方式是使用strtok如下。該字符串作爲char *標記輸入。

op_tok1 = strtok(token, "\\"); 
if(op_tok1 != NULL) 
{ 
     /* Process numbers */ 
     return; 
} 

op_tok2 = strtok(token, ","); 
if(op_tok2 != NULL) 
{ 
    /* Process other numbers */ 
    return; 
} 

這適用於任何用反斜槓隔開的東西,但不適用於逗號。我相信這是因爲strtok使用了令牌變量。這是真的?有沒有更好的方法來解決這個問題?謝謝!

+0

您是否嘗試過使用逗號strtok創建'token'的副本? – gcochard 2012-04-27 21:52:25

回答

2

我肯定有更好的方法。如果你能對輸入的格式(即,真的是三個數字,然後在允許的分隔符之一)依賴相當不錯,你可以這樣做:

char *pos = 0; 

while (2 == sscanf(input+pos, "%d%c", &number, &delimiter)) { 
    if ('\\' == delimiter) 
     process_backslash(number); 
    else if (',' == delimiter) 
     process_comma(number); 
    else 
     error_invalid_delimiter(delimiter); 
    pos += 4; 
} 
+0

我同意'sscanf'方法在這種情況下肯定更好。 – jedwards 2012-04-27 22:20:57

+0

如果*不能*相信要格式化的輸入,則可以使用'getchar()'類似的方法。基本上,每次讀取並驗證一個字符,而不是一次性用'sscanf()'把它們全部磨成一團。這應該比'strtok()'更好,同時仍然爲您提供更多的功能來檢測無效輸入。 – bta 2012-04-27 23:15:20

0

其他人發佈更好的解決方案 - strtok的不真的很適合這個任務。然而,在回答第一個問題 - 是strtok函數改變基本的字符串,是:

strtok內容替換令牌\0(空終結符)和(在我的腦海它是如何工作的邪惡許多年輕球員已經跌入這個陷阱。)傳遞字符串的開始。隨後調用​​繼續掃描字符串,查找下一個不需要相同的標記。

因此你可以這樣做:

op_tok1 = strtok(token, "\\"); 
if(op_tok1 != NULL) 
{ 
    /* Process numbers */ 
    return; 
} 

op_tok2 = strtok(NULL, ","); 
if(op_tok2 != NULL) 
{ 
    /* Process other numbers */ 
    return; 
} 

另外注意的是不是線程安全

0

爲什麼不只是使用scanf()

~/tmp$ cat test.c 
#include <stdio.h> 
int main(int argc, char ** argv) { 
    int i; 
    char c; 
    while (2 == scanf("%d%[\\.]",&i,&c)) { 
     printf("Int %d\nChar %c\n", i, c); 
    } 
} 

...爲我工作。

~/tmp$ gcc test.c && echo "123.456\789.4" | ./a.out 
Int 123 
Char . 
Int 456 
Char \ 
Int 789 
Char . 
~/tmp$