2016-01-22 3 views
3

я следующая строка:Разбивает строку по подстроке

char str[] = "A/USING=B)"; 

Я хочу, чтобы разделить, чтобы получить отдельный A и B значения с /USING= в качестве разделителя

Как я могу это сделать? Я знал strtok(), но он просто разделился на один символ как разделитель.

+0

Вы можете использовать ['strchr'] (http://en.cppreference.com/w/c/string/byte/strchr), чтобы найти' '/ '', '' = 'и'') '' и получить подстроки, используя, например, ['strncpy'] (http://en.cppreference.com/w/c/string/byte/strncpy) (или просто [' strcpy'] (http: //en.cppreference.com/w/c/string/byte/strcpy), если вы можете изменить исходную строку). –

+0

Я только что узнал, что моя входная строка имеет точно '/ USING =' уникально, 'A' и' B', например, может включать в себя '\' или '=' – Ryo

+1

Тогда как насчет ['strstr'] (http : //en.cppreference.com/w/c/string/byte/strstr), чтобы найти начальную позицию подстроки –

ответ

1

См. this. Я получил это, когда искал ваш вопрос в Google.

В вашем случае это будет:

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

int main (int argc, char* argv []) 
{ 
    char theString [16] = "abcd/USING=efgh"; 
    char theCopy [16]; 
    char *token; 
    strcpy (theCopy, theString); 
    token = strtok (theCopy, "/USING="); 
    while (token) 
    { 
     printf ("%s\n", token); 
     token = strtok (NULL, "/USING="); 
    } 

    return 0; 
} 

Это использует /USING= в качестве разделителя.

Выход этого было:

abcd                                                      
efgh 

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

+0

Спасибо, это сработало! – Ryo

+1

Извините, но я просто реализую для своей реальной строки ввода 'char str [] = SELECT * FROM ACN WHERE CID =: C1 И ACCTNAME =: C2/USING = (C1 = 70, C2 = '0D100S')', но это не работа, как я и ожидал, пожалуйста, помогите мне его проверить. ' – Ryo

+0

Дайте мне минуту. Позвольте мне скомпилировать и проверить его. –

2

Как указывали другие, вы можете использовать strstr от <string.h>, чтобы найти разделитель в своей строке. Затем либо скопируйте подстроки, либо измените входную строку, чтобы разбить ее.

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

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

char *split(char *str, const char *delim) 
{ 
    char *p = strstr(str, delim); 

    if (p == NULL) return NULL;  // delimiter not found 

    *p = '\0';      // terminate string after head 
    return p + strlen(delim);  // return tail substring 
} 

int main(void) 
{ 
    char str[] = "A/USING=B"; 
    char *tail; 

    tail = split(str, "/USING="); 

    if (tail) { 
     printf("head: '%s'\n", str); 
     printf("tail: '%s'\n", tail); 
    } 

    return 0; 
} 
+0

Эта работа для меня с моей настоящей струной, спасибо! – Ryo

2

я знал strtok(), но это только разделить на один символ в качестве разделителя

Nopes, это не так.

Согласно man page для strtok)() (курсив мой)

char *strtok(char *str, const char *delim);

[...] delim аргумент задает набор байтов, что разграничить маркеры в разобранный строка. [...] Последовательность двух или более смежных байтов ограничителя в анализируемой строке считается единственным разделителем. [...]

Таким образом, это не должно быть "один символ" как вы уже упоминали. Вы можете использовать строку, например, в вашем случае "/USING=" в качестве разделителя, чтобы выполнить задание.

+0

Благодарим вас за исправление: D. – Ryo

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