2016-01-08 2 views
2

У меня есть ввод формы (first_string*second_string), где * может быть одним из трех символов, x, y или z. Мне нужно извлечь first_string и second_string как собственные строки.Как отделить строки на основе нескольких разделителей в C?

Я могу сделать это с strchr если * всегда было то же самое, но я не знаю, как это сделать, когда * это один из трех возможных символов.

Я предполагаю, что мне нужно использовать функцию вида

int star(char g) { 
    if (g == 'x' || g == 'y' || g == 'z') { 
     return 1; 
    } 
    else { 
     return 0; 
    } 
} 

, но я не уверен, как действовать дальше. Может кто-нибудь мне помочь?

+2

Без специальной функции, итерации строки, найдите индекс специального символа, а затем просто нарежьте строку в этом индексе. –

+0

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

+0

Вопрос странный. Название гласит: «Как найти две строки между символами в C», но поиск кода для разделителя. – Michi

ответ

4

Использовать strpbrk() вместо strchr().

Пример

char *found; 
if ((found = strpbrk(source, "xyz")) != NULL) 
{ 
    // `found' now points to one of `x' or `y' or `z' in `source' 
} 

очевидный недостаток в том случае, если "строки" содержат эти символы.

0

Учитывая ваше определение star() функции

char *ptr; 
if(star(g)) 
{ 
    ptr = strchr(s, g); 

    if(ptr) 
     *ptr = '\0'; 
    printf("First string = %s\n", s); 

    if(ptr) 
     printf("Second string = %s\n", ptr + 1); 
} 
+0

Если 'p' указывает на конец последней подстроки, ваше решение создает неопределенное поведение. –

+1

@CareyGregory Если у нас есть разделитель в конце, то есть «foox», то 'ptr' будет указывать на' x', а 'ptr + 1' будет указывать на' \ 0'. Поэтому я не понимаю, почему * неопределенное поведение *? – rootkea

+0

И если в конце нет разделителя? (т. е. «foo» не «foox»). Плохой ввод не должен приводить к сбою вашей программы. –

3

Есть много способов сделать задачу. Например, вы можете использовать стандартную функцию C strtok, объявленную в заголовке <string.h>.

Например

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

int main(void) 
{ 
    char s[] = "first_stringxsecond_string"; 

    const char *delimiters = "xyz"; 

    char *p = strtok(s, delimiters); 

    while (p) 
    { 
     puts(p); 
     p = strtok(NULL, delimiters); 
    } 
}  

Выход программы

first_string 
second_string 

Примите во внимание, что функция strtok изменяет исходную строку, вставляя завершающего нуля. Поэтому вы можете не применять эту функцию для строковых литералов.

Если вы не можете изменить исходную строку, вы должны рассмотреть другие подходы.

Смежные вопросы