Как зациклить строку, используя strstr, чтобы найти подстроки в C - PullRequest
0 голосов
/ 11 сентября 2018

Я пытаюсь найти разные подстроки информации из более крупной строки, где информация разделена ":"

Например: имя пользователя: id: пароль: информация

Как я могу использовать функцию strstr в цикле C этой строки для извлечения информации в другую подстроку?

До сих пор я пробовал что-то вроде:

char string[] = "username:id:password:info"
char *endptr;

if((endptr = strstr(string, ":")) != NULL)  {
  char *result = malloc(endptr - string + 1);
  if(result != NULL) {
    memcpy(result, string, (endptr - string));
    result[endptr - string] = '\0';
    username = strdup(result);
    free(result);
  }
}

Iхочу сделать это петли для извлечения всех подстрок.

1 Ответ

0 голосов
/ 11 сентября 2018

найти различные подстроки информации из более крупной строки, где информация отделена ":"
Как я мог использовать функцию strstr в цикле C этой строки для извлечения информации в другую подстроку?

strstr() не лучший инструмент для этой задачи, но его можно использовать для поиска ":".
Вместо этого я бы порекомендовал strcspn(string, "\n"), поскольку цель состоит в том, чтобы найти следующий ":" или нулевой символ .

Код OP'c близок к формированию цикла, но также должен обрабатывать последний токен, в котором отсутствует конечный ':'.

void parse_colon(const char *string) {
  while (*string) { // loop until at the end
    size_t len;
    const char *endptr = strstr(string, ":"); // much like OP's code
    if (endptr) {
      len = (size_t) (endptr - string);  // much like OP's code
      endptr++;
    } else {
      len = strlen(string);
      endptr = string + len;
    }
    char *result = malloc(len + 1);
    if (result) {
      memcpy(result, string, len);
      result[len] = '\0';
      puts(result);
      free(result);
    }
    string = endptr;
  }
}

int main(void) {
  parse_colon("username:id:password:info");
}

выход

username
id
password
info
...