2012-12-02 178 views
0

我需要我的程序來獲取一系列文件名(存儲在單個「字符串」中,並用逗號分隔)並對其執行操作。逗號分隔C

的僞代碼將是:

for each filename in some_string 
    open filename 
    operate on contents of filename 
    close filename 

的問題是,我卡分離some_string( 「文件名1,文件名2,...,filenamen」)到[文件名1],[2名] ,... [文件名n]。

編輯:爲了澄清,保持some_string完整並根據需要提取每個文件名似乎更簡單,這正是我正在嘗試執行的操作。

我的代碼,因爲它的立場,是非常笨拙的(和相當噁心...)

int j = 0; 
char *tempS = strdup(filenames); 
while (strchr(tempS, ',')) { 
    char *ptr = strchr(tempS, ','); 
    *ptr++ = '.'; 
    numFiles++; 
} 

for (; j < numFiles; j++) { 
    char *ptr = strchr(tempS, ','); 

    //don't know where to go from here... 
    fin = openFile(tempS); 
    if (fin != NULL) { 
     //do something 
    } 
    fclose(fin); 
} 

它沒有這樣做,很明顯。我正確地找到了文件的數量,但是在確定如何從源字符串中逐個分離一個文件並對其進行操作時,我有點失落。

+0

我不是在尋找正則表達式(或同樣複雜的解決方案),要麼。我正在尋找一個簡單的機械答案。 –

+1

由於您已經通過'strdup'複製了字符串,請嘗試拷貝上的'strtok' - 不要忘記釋放拷貝。 – John3136

+0

使用'strtok(str,「,」);'。在第一次調用中,'str'是你的字符串,在隨後的調用NULL中。 –

回答

1

您可以使用strtok這個

char *fname = strtok(tempS, ","); 
while (fname != NULL) { 
    /* process filename */ 
    fname = strtok(NULL, ","); 
} 

strtok提供以逗號分隔字符串,一個接一個。

+1

'strtok()'帶兩個'const char *' – Jack

+1

@Jack感謝您的發現,修復。 –

+0

我可以問爲什麼你使用NULL爲隨後調用strtok? –

1

通常用於拆分C中的字符串,使用C標準庫中的strok()函數。

#include <string.h> 
... 
char *token; 
char *line = "string1,string2,string3"; 
char *search = ","; 

token = strtok(line, search); 

token = strtok(NULL, search); 
0

strtok()不是多線程安全的。如果這對你很重要,你應該使用strtok_r()。例如:

char *savedptr = NULL /* to be passed back to strtok_r in follow-on calls */ 
    char *tempS = strdup(some_string); /* to keep your original intact */ 
    char *fname = strtok_r(tempS, ",", savedptr); 
    while (fname != NULL) { 
     /* process fname ... */ 
     fname = strtok_r(NULL, ",", savedptr); /* pass savedptr back to strtok_r */ 
    }