2013-09-22 5 views
0

Я хочу, чтобы разбить строку на C.Строка Раскол в C

Моя строка определяется моим Struct:

struct String 
{ 
    char *c; 
    int length;    
    int maxLength;  
} 

Тогда у меня есть функция, которая делает расщепление. Возможно, у C есть что-то, что делает это, но, хотя я и хотел своего, я не нашел ничего, что сделает это до сих пор.

String ** spliter(String *s) 
{ 
    if(s == NULL) 
    return NULL; 

    // set of splitters: {'\n', ' '} 

} 

Input выглядит примерно так: This is Sparta. Тогда я хочу, чтобы вернуть указатель на каждый массив символов.

*p1 = This 
*p2 = is 
*p3 = Sparta. 

Если это имеет смысл, я хочу, массив указателей, и каждый указатель указывает на массив символов.

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

Похожие проблемы: c splitting a char* into an char**

Итак, как я могу идти об этом?

+0

Я немного боюсь strtok, так как он уничтожит исходную строку, поданную в нее. –

+0

Используйте 'strdup', чтобы сделать копию? – charmlessCoin

+0

У кого-нибудь есть .c исходный код для strtok? –

ответ

0

Вы ищете strtok, выезд man 3 strtok, или here, если вы не на * nix.

Вы бы использовать его как это: (При условии, что вы можете написать add_string код самостоятельно.)

String ** spliter(String *s) 
{ 
    if(s == NULL) 
    return NULL; 

    String **return_strings = NULL; 
    char *delim = " \n"; 
    char *string = strtok(s, delim); 
    int i = 0; 


    for(i = 0; add_string(return_strings, string, i) != -1; i++) { 
     string = strtok(NULL, delim); 
    } 

    return strings; 
} 

Обратите внимание, что если вам нужно сохранить исходную строку (strtok изменяет строку она работает на), вам нужно будет позвонить strdup в исходную строку, а затем работать с копией.

РЕДАКТОР: ОП сказал, что у него проблемы с размышлениями о указателях. С приведенным выше примером кода add_string нужно беспокоиться только о том, чтобы иметь дело с строкой символов, в отличие от массива указателей на указатели на символы. Так что это может выглядеть примерно так:

int add_string(String **strings, char *s, int len) 
{ 
    if(s == NULL) 
     return -1; 

    String *current_string = NULL; 
    strings = realloc(strings, sizeof(String) * (len + 1)); 
    current_string = strings[len]; 

    /* fill out struct fields here */ 
} 
0
#include <string> 
#include <iostream> 
#include <vector> 
using namespace std; 


int main() 
{ 
    string test = "aa aa bbc cccd"; 
    vector<string> strvec; 
    string strtemp; 

    string::size_type pos1, pos2; 
    pos2 = test.find(' '); 
    pos1 = 0;   
    while (string::npos != pos2) 
    { 
      strvec.push_back(test.substr(pos1, pos2 - pos1)); 

      pos1 = pos2 + 1; 
      pos2 = test.find(' ', pos1); 
    } 
    strvec.push_back(test.substr(pos1)); 

    vector<string>::iterator iter1 = strvec.begin(), iter2 = strvec.end(); 
    while (iter1 != iter2) 
    { 
      cout << *iter1 << endl; 
      ++iter1; 
    } 

    return 0; 

} 
0

здесь является Exemple:

String ** spliter(String *s)                                               
{ 
    int i; 
    int j; 
    char *p1; 
    char *p2; 
    char *p3; 

    i = 0; 
    j = 0; 
    if(s == NULL) 
    return NULL; 
    p1 = malloc(sizeof(*p1) * strlen(s)); 
    p2 = malloc(sizeof(*p2) * strlen(s)); 
    p3 = malloc(sizeof(*p3) * strlen(s)); 
    while (s[i] != ' ') 
    { 
     p1[j++] = s[i]; 
     i++; 
    } 
    i++; 
    j = 0; 
    while (s[i] != ' ') 
    { 
     p2[j++] = s[i]; 
     i++; 
    } 
    i++; 
    j = 0; 
    while (s[i] != '\0') 
    { 
     p3[j++] = s[i]; 
     i++; 
    } 
    printf("%s\n", p1); 
    printf("%s\n", p2); 
    printf("%s\n", p3); 
} 
0

Вы смотрели на strtok? Это можно сделать с помощью strtok.

0

add strdup и strtok могут работать с копией строки. Вызов split() более общий, чем другие примеры spliter(), но делает то же самое с strtok на дубликат.

char ** 
split(char **result, char *w, const char *src, const char *delim) 
{ 
    int i=0; 
    char *p; 
    strcpy(w,src); 
    for(p=strtok(w, delim) ; p!=NULL; p=strtok('\0', delim)) 
    { 
     result[i++]=p; 
     result[i]=NULL; 
    } 
    return result; 
} 

void display(String *p) 
{ 
    char *result[24]={NULL}; 
    char *w=strdup(p->c); 
    char **s=split(result, w, p->, "\t \n"); split on \n \t and space as delimiters 
    for(; *s!=NULL; s++) 
     printf("%s\n", *s); 
    free(w); 
} 
Смежные вопросы