2012-09-17 60 views
0

我有這個字符串: char *path = " one\\\two\\\five\\\six";如何使用「\」或「」分割字符串?

我想單獨給一個數組時,每一個細胞是字符串。 我正在使用strtok,買我的問題是在計算爲陣列分配多少空間。

我這樣做:

for (i = 0 ; i < strlen(path) ; i++) 
{ 
    if (path[i] == '\' && path[i+1] == '\') /*doesn't work! :(*/ 
     counter++ 
} 

比較線是不工作...我也嘗試寫:「\」,但它不能正常工作。 有什麼不對?

編輯 我試圖使用的strtok和它得到的凌亂:(

 char   seps[]  = "\\"; 
    char   *elemName = NULL; 

elemName = strtok(path, seps); 

while(elemName != NULL) 
    { 
      /* While there are tokens in "string" */ 
     /*copy the elemName*/ 
     stringArr[runner] = strdup(elemName); 
     /* Get next token: */ 
      elemName = strtok(NULL, seps); 
    } 
printf("printing the strings!!!!\n"); 
for (i = 0 ; i < arr_size ; i++) 
{ 
    printf (" %s \n " , stringArr[i]); 
} 
+0

你逃離「與第一\,我相信你必須使用if(路徑[我] == '\\' &&路徑[I + 1] == '\\')。這是因爲第一個「告訴下一個」被用作「符號」而不是再次作爲逃避符號。所以作爲回報\\給你一個「\」字母來比較。 – Najzero

+0

我還會注意到,在最後一次迭代中,你是越界的路徑[i + 1]將參加垃圾 – Yarneo

+0

我很抱歉沒有取消你的名字... path [i]是一個char..can我用它的ascii?像:char [i] == 92 && char [i + 1] == 92 ..?以及如何在比較時輸入兩個字符? :'\\'是兩個字符不是? – user1386966

回答

1

你需要寫'\\'(或數字92,因爲它是\ ASCII值)。\是一個轉義字符,並如果你想擁有它包含字符串,你需要逃避它在它自己的

解釋:。\(whatever)被轉換爲一個字符在編譯階段(例如,\n - >字符與ASCII值的0x0A)

+0

不確定涉及數字ASCII值是個好主意。無論如何,換行(''\ n'')的ASCII值是10,而不是0x10。 – unwind

+0

@unwind,在我看來,它對於理解它如何在'下面'起作用很有幫助。不過,感謝您的糾正。 – nothrow

0

你要逃避斜線:'\\'代表反斜槓字符\

0

一個字符串聲明如下:

char * path = "one\\two" 

有7個(+1)字符, 'O' 'N' 'E' '\''''''''''('\ 0')。那是因爲你必須逃避單個反斜槓。因此,只使用這樣的:

if (path[i] == '\\') { 
    counter++; 
} 
1

請記住,在一個字符串或字符文字的\字符是轉義字符(如在由尤索林答案解釋),這意味着,即使你有一個包含\\字符串文字編譯器會將它轉換爲實際字符串中的單個\

所以,如果你在你的代碼有:

char *path = " one\\two\\five\\six" 

如果您打印出來(如與printf),你會看到,它是:

 
one\two\five\six 

這意味着你的邏輯是錯誤的,而且您不必檢查兩個反斜槓,這也意味着您不必擔心超出字符串末尾的讀數。

0

使用'\'拆分「\」上的拆分​​使用單個「\」將不起作用,因爲「\」是轉義字符。

0

對於你的分配問題: 你只應該爲NULL結尾的字符串指針數組分配內存。

因此,通過字符串循環,並計數分隔符。你需要分配2 +計數。還有一個字符串,然後是分隔符,另外還有一個終止空指針。

char **strv = malloc((2 + count) * sizeof(char*)); 

下一步是再次循環字符串,並在剛分配的數組中設置指針。喜歡的東西:

strv[ i++ ] = string; 

for (pstr = string; *pstr != '\0'; pstr++){ 
    if(*pstr == delimiter) { 
     *pstr = '\0'; 
     strv[ i++ ] = pstr + 1; 
    } 
} 
strv[ i ] = NULL; 

(代碼修改原始字符串。) 記住釋放了字符串和分配的指針數組。

我假設'\\'是一個轉義字符,後跟反斜槓。 '\'因此只是一個字符。確保代碼的計數部分不計算兩次。

-Øystein