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

  • 本文关键字:扫描输入 字符 string
  • 更新时间 :
  • 英文 :


我正在开发一个函数,该函数接受文件路径并将它们分割成更小的部分。

例如,如果输入参数是"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;
}

最新更新