0

我需要我的程序获取一系列文件名(存储在单个“字符串”中并用逗号分隔)并对其进行操作。

伪代码将是:

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

问题是我坚持将 some_string ("filename1,filename2,...,filenamen") 分成 [filename 1]、[filename 2]、... [filename 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);
}

显然,这还没有完成。我正确地找到了文件的数量,但是在弄清楚如何一次从源字符串中分离一个文件并对其进行操作时,我有点迷茫。

4

3 回答 3

1

你可以用strtok这个

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

strtok一个一个地传递以逗号分隔的字符串。

于 2012-12-02T23:53:02.520 回答
1

通常在 C 中拆分字符串时,使用 C 标准库中的strok()函数。

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

token = strtok(line, search);

token = strtok(NULL, search);
于 2012-12-02T23:51:32.603 回答
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 */
    }
于 2012-12-03T03:57:46.950 回答