如何在某个字符后停止扫描输入?

时间:2011-04-30 01:02:40

标签: c string

我正在开发一个函数,它接收文件路径并将它们切成小块。

例如,如果输入参数是“cd mypath / mystuff / stack / overflow / string”,我希望能够返回“cd”“mypath”,“mystuff”,“stack”,“overflow”,和“字符串”连续。

虽然我可以简单地继续使用“getchar”,将结果追加到一个不断增加的字符串,当getchar返回'/'时停止,我觉得必须是一种更优雅的方式实现相同的功能。

有什么想法吗?

3 个答案:

答案 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;
}