Существует большое количество подходов к проблеме. От обхода пары указателей вниз по строке для поиска разделителей и большого количества строковых функций, предоставляемых в string.h
. Вы можете использовать функции поиска символов, такие как strchr
, или функции поиска строк, такие как strpbrk
, вы можете использовать функции токенизации, такие как strtok
и т. д.
Посмотрите и учитесь у них всех. Вот реализация с strpbrk
и разницей указателей. Это неразрушающий метод, поэтому вам не нужно делать копию исходной строки.
#include <stdio.h>
#include <string.h>
int main (void) {
const char *line = "'foobar'|cat";
const char *delim = "'"; /* delimiter, single quote */
char *p, *ep;
if (!(p = strpbrk (line, delim))) { /* find the first quote */
fprintf (stderr, "error: delimiter not found.\n");
return 1;
}
p++; /* advance to next char */
ep = strpbrk (p, delim); /* set end pointer to next delim */
if (!p) { /* validate end pointer */
fprintf (stderr, "error: matching delimiters not found.\n");
return 1;
}
char substr[ep - p + 1]; /* storage for substring */
strncpy (substr, p, ep - p); /* copy the substring */
substr[ep - p] = 0; /* nul-terminate */
printf ("\n single-quoted string : %s\n\n", substr);
return 0;
}
Пример использования/вывода
$ ./bin/substr
single-quoted string : foobar
Без использования string.h
Как упоминалось выше, вы также можете просто пройти пару указателей вниз по строке и таким же образом найти свои пары кавычек. Для полноты приведем пример поиска нескольких строк в кавычках в одной строке:
#include <stdio.h>
int main (void) {
const char *line = "'foobar'|cat'mousebar'sum";
char delim = '\'';
char *p = (char *)line, *sp = NULL, *ep = NULL;
size_t i = 0;
for (; *p; p++) { /* for each char in line */
if (!sp && *p == delim) /* find 1st delim */
sp = p, sp++; /* set start ptr */
else if (!ep && *p == delim) /* find 2nd delim */
ep = p; /* set end ptr */
if (sp && ep) { /* if both set */
char substr[ep - sp + 1]; /* declare substr */
for (i = 0, p = sp; p < ep; p++)/* copy to substr */
substr[i++] = *p;
substr[ep - sp] = 0; /* nul-terminate */
printf ("single-quoted string : %s\n", substr);
sp = ep = NULL;
}
}
return 0;
}
Пример использования/вывода
$ ./bin/substrp
single-quoted string : foobar
single-quoted string : mousebar
Просмотрите все ответы и дайте нам знать, если у вас есть какие-либо вопросы.
person
David C. Rankin
schedule
24.04.2016
sscanf
. - person Niklas R.   schedule 25.04.2016