我正在开发一个函数,它接收文件路径并将它们切成小块。
例如,如果输入参数是“cd mypath / mystuff / stack / overflow / string”,我希望能够返回“cd”“mypath”,“mystuff”,“stack”,“overflow”,和“字符串”连续。
虽然我可以简单地继续使用“getchar”,将结果追加到一个不断增加的字符串,当getchar返回'/'时停止,我觉得必须是一种更优雅的方式实现相同的功能。
有什么想法吗?
答案 0 :(得分:1)
您可以使用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 path\n", 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("%s\n", token);
}
return 0;
}
clang -Wall *.c && ./a.out mypath/mystuff/stack/overflow/string
mypath
mystuff
stack
overflow
string
答案 1 :(得分:1)
以下是sscanf()
在某个角色后可以停止的示例。
sscanf("abcd/efgh", "%[^/]", &buf);
printf("%s\n", buf);
应该产生
abcd
编辑:你可以尝试这样的东西来推进sscanf()输入。我没有针对各种边缘情况对此进行测试,但它应该得到这个想法。
char *str = "abcd/efgh/ijk/xyz";
while (sscanf(str, "%[^/]%n", &buf, &n)) {
printf("%s\n", buf);
str += n;
if (*str == '\0')
break;
++str;
}
应该产生
abcd
efgh
ijk
xyz
答案 2 :(得分:0)
以下是使用regcomp,regexec的示例。编译并运行它,第一个arg是你正在搜索的字符,而第二个arg是要搜索的字符串。
例如,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 != '\0'; cp += len) {
len = (regexec(&preg, cp, 1, &match, 0) == 0) ? match.rm_eo : strlen(cp);
token = malloc(len);
strncpy(token, cp, len);
printf("%s\n", token);
}
return 0;
}