逗号定界C

逗号定界C,c,C,我需要我的程序获取一系列文件名(存储在单个“字符串”中并用逗号分隔)并对其进行操作 psuedo代码应为: for each filename in some_string open filename operate on contents of filename close filename 问题是我无法将一些字符串(“filename1,filename2,…,filenamen”)拆分为[filename 1],[filename 2]。。。[文件名n] 编辑:为

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

psuedo代码应为:

for each filename in some_string
    open filename
    operate on contents of filename
    close filename
问题是我无法将一些字符串(“filename1,filename2,…,filenamen”)拆分为[filename 1],[filename 2]。。。[文件名n]

编辑:为了澄清,保留一些_字符串并根据需要提取每个文件名似乎更简单,这就是我正在尝试做的

目前,我的代码相当笨重(而且相当恶心…)

intj=0;
char*tempS=strdup(文件名);
while(strchr(tempS,,')){
char*ptr=strchr(tempS,,);
*ptr++=';
numFiles++;
}
对于(;j

显然,这还没有完成。我正确地找到了文件的数量,但在计算如何一次从源字符串中分离一个文件并对其进行操作时,我有点不知所措

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

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

token = strtok(line, search);

token = strtok(NULL, search);
#包括
...
字符*令牌;
char*line=“string1、string2、string3”;
char*search=“,”;
令牌=strtok(行,搜索);
token=strtok(空,搜索);
您可以使用

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

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 */
    }

我也不是在寻找正则表达式(或者一个同样复杂的解决方案)。一个简单、机械的答案就是我想要的。既然您已经通过
strdup
复制了字符串,请在副本上尝试
strtok
——不要忘记释放副本。使用
strtok(str,“,”。在第一次调用中,
str
是您的字符串,在后续调用中
NULL
strtok()
取两个
const char*
@Jack感谢您的发现,修复了。我能问一下为什么在后续调用strtok时使用NULL吗?@tylersbastian这就是
strtok
的工作方式。你给它一个字符串,在第一次调用中拆分,在所有后续调用中为NULL。啊,就是这么简单,呃。。。没有什么把戏,这就是它的设计。
char *fname = strtok(tempS, ",");
while (fname != NULL) {
    /* process filename */
    fname = strtok(NULL, ",");
}
    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 */
    }