我正在开发一个函数,该函数接受文件路径并将它们分割成更小的部分。
例如,如果输入参数是"cd mypath/mystuf/stack/overflow/string",我希望能够连续返回"cd"mypath"、"mystuff"、"stack"、"overflow"one_answers"string"。
虽然我可以简单地继续使用"getchar",将结果附加到不断增加的字符串中,当getchar返回"/"时停止,但我觉得必须有一种更优雅的方式来实现相同的功能。
有什么想法吗?
您可以使用char * strtok ( char * str, const char * delimiters );
,使用/
作为分隔符。
这里有一个例子:http://www.cplusplus.com/reference/clibrary/cstring/strtok/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char* argv[]) {
if (argc != 2) {
fprintf(stderr, "Usage: %s pathn", argv[0]);
exit(EXIT_FAILURE);
}
char* saveptr = NULL;
for (char* str = argv[1]; ; str = NULL) {
char *token = strtok_r(str, "/", &saveptr);
if (token == NULL)
break;
printf("%sn", token);
}
return 0;
}
示例
clang -Wall *.c && ./a.out mypath/mystuff/stack/overflow/string
mypath
mystuff
stack
overflow
string
以下是sscanf()
如何在某个字符后停止的示例。
sscanf("abcd/efgh", "%[^/]", &buf);
printf("%sn", buf);
应产生
abcd
编辑:你可以尝试这样的方法来推进sscan((输入。我还没有在各种边缘案例中测试过这一点,但它应该能让人理解这个想法。
char *str = "abcd/efgh/ijk/xyz";
while (sscanf(str, "%[^/]%n", &buf, &n)) {
printf("%sn", buf);
str += n;
if (*str == ' ')
break;
++str;
}
应该产生
abcd
efgh
ijk
xyz
下面是一个使用regcomp、regexec的示例。编译并运行它,第一个参数是您要搜索的字符,而第二个参数是要搜索的字符串。
例如,a.out X abcXdefXghiXjkl将在单独的行上打印abc def ghi jkl。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <regex.h>
int
main(int argc, char *argv[]) {
int len;
char *cp;
char *token;
regex_t preg;
regmatch_t match;
if (regcomp(&preg, argv[1], REG_EXTENDED) != 0) {
return 0;
}
for (cp = argv[2]; *cp != ' '; cp += len) {
len = (regexec(&preg, cp, 1, &match, 0) == 0) ? match.rm_eo : strlen(cp);
token = malloc(len);
strncpy(token, cp, len);
printf("%sn", token);
}
return 0;
}