Разбор строки - PullRequest
       21

Разбор строки

6 голосов
/ 23 апреля 2010

У меня есть строка в формате "ABCDEFG, 12: 34: 56: 78: 90: 11".Я хочу разделить эти два значения, которые разделены запятыми в две разные строки.Как я могу сделать это в GCC, используя язык C.

Ответы [ 6 ]

7 голосов
/ 23 апреля 2010

Одна возможность выглядит примерно так:

char first[20], second[20];

scanf("%19[^,], %19[^\n]", first, second);
3 голосов
/ 23 апреля 2010

Так много людей предлагают strtok ... Почему? strtok является пережитком каменного века программирования и подходит только для 20-строчных утилит!

Каждый вызов strtok изменяет strToken, вставляя нулевой символ после токена, возвращенного этим вызовом. [...] Unction [F] использует статическую переменную для разбора строки в токены. [...] Чередование вызовов этой функции может привести к повреждению данных и получению неточных результатов.

scanf, как в ответе Джерри Коффина , является гораздо лучшей альтернативой. Или вы можете сделать это вручную: найдите разделитель с помощью strchr, затем скопируйте части в отдельные буферы.

3 голосов
/ 23 апреля 2010
char str[] = "ABCDEFG,12:34:56:78:90:11"; //[1]

char *first = strtok(str, ",");  //[2]
char *second = strtok(NULL, "");  //[3]

[1]  ABCDEFG,12:34:56:78:90:11  

[2]  ABCDEFG\012:34:56:78:90:11
     Comma replaced with null character with first pointing to 'A'

[3]  Subsequent calls to `strtok` have NULL` as first argument.
     You can change the delimiter though.

Note: you cannot use "string literals", because `strtok` modifies the string.
1 голос
/ 23 апреля 2010

Вы можете использовать strtok :

Пример из cppreference.com :

 char str[] = "now # is the time for all # good men to come to the # aid of their country";
 char delims[] = "#";
 char *result = NULL;
 result = strtok( str, delims );
 while( result != NULL ) {
     printf( "result is \"%s\"\n", result );
     result = strtok( NULL, delims );
 }
1 голос
/ 23 апреля 2010

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

0 голосов
/ 23 апреля 2010

Попробуйте использовать следующее регулярное выражение, оно найдет что-нибудь с символами a-z A-Z, за которыми следует ","

"[A-Z] ," если вам нужна строчная буква, попробуйте "[a-zA-Z] ,"

Если вам нужно сначала найти вторую часть, попробуйте следующее

», [0-9] {2}: [0-9] {2}: [0-9] {2}: [0-9] {2}: [0-9] {2}: [0-9] {2} "

Существует пример использования REGEX на http://ddj.com/184404797

Спасибо, V $ h3r

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