Как я могу остановить сканирование ввода после определенного символа? - PullRequest
2 голосов
/ 30 апреля 2011

Я работаю над функцией, которая берет пути к файлам и разбивает их на более мелкие секции.

Например, если входным параметром был "cd mypath / mystuff / stack / overflow / string", я хочучтобы иметь возможность возвращать «cd», «mypath», «mystuff», «stack», «overflow» и «string» подряд.

Хотя я мог просто постоянно использовать «getchar», добавляя результатык постоянно растущей строке, останавливаясь, когда getchar возвращает '/', я чувствую, что должен быть более элегантным способом достижения той же функциональности.

Есть идеи?

Ответы [ 3 ]

1 голос
/ 30 апреля 2011

Вот пример того, как 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
1 голос
/ 30 апреля 2011

Вы можете использовать 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
0 голосов
/ 30 апреля 2011

Вот пример использования regcomp, regexec. Скомпилируйте и запустите его, указав в качестве первого аргумента символ 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...