извлечение подстрок в C - PullRequest
       10

извлечение подстрок в C

5 голосов
/ 07 декабря 2009

У меня есть строка: "foo$bar@baz"

Я хочу написать программу на C, которая извлечет все три подстроки ("foo", "bar" и "baz") и поместит каждую в свою собственную строку.

P.S. Не волнуйтесь, это не домашнее задание.

Ответы [ 4 ]

10 голосов
/ 07 декабря 2009

То, что вы ищете, это strtok . Это позволяет вам также установить разделители.

1 голос
/ 08 декабря 2009

Поскольку это прямой C, может быть интересно вернуться к тому, как строки хранятся и завершаются. Поскольку у вас есть один завершающий символ для каждого раздела, вы можете просто превратить его в настоящий терминатор ('\ 0') и оставить строки на месте:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char **argv) {

char *s1,*s2,*s3, *test = "foo$bar@baz";
char *buf=(char *)malloc(100);
char *p,c;

strcpy(buf, test);

s1 = p = buf;
while(c = *p) {
  if (c == '$') { *p = '\0'; s2 = p+1; }
  if (c == '@') { *p = '\0'; s3 = p+1; }
  p++;
}

printf("s1 = %s\n",s1);
printf("s2 = %s\n",s2);
printf("s3 = %s\n",s3);

}

Я бы не стал делать это в рабочем коде, в наше время. Но уже тогда, когда выполнение одного прохода цикла и одной копии для хранения считалось бы большой победой.

1 голос
/ 07 декабря 2009

если это не для домашней работы :-), чем strtok не рекомендуется, если вы не можете использовать C ++ (почему?), Вы должны использовать strtok_r (реентрентная версия)

0 голосов
/ 07 декабря 2009

Strtok сохраняет статический буфер при токенизации, который перезаписывается при вызове в другом месте с новой строкой, отличной от NULL, что может нарушить требуемую функциональность. например переплетенные звонки с разными строками.

Вместо этого вы можете использовать strsep, который похож на strtok, но вы сохраняете временный буфер самостоятельно, на случай, если вам понадобится токенизировать несколько строк, например, с переплетенными вызовами с разными строками.

В небольших случаях эта проблема, вероятно, не возникнет, но может и в более крупных проектах.

РЕДАКТИРОВАТЬ: это не стандарт c, поэтому убедитесь, что у вас есть эта функция, прежде чем пытаться ее использовать. Я точно знаю, что он доступен на BSD и, возможно, на других Unix

РЕДАКТИРОВАТЬ: strsep и strtok_r имеют одинаковую функциональность

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...