2013-11-14 4 views
0

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

у меня есть:

char *s = "--ab--c--"; 
char **substrings; 
int split(char *s, int start, char sep, char **substrings, int max) 

Я не знаю, если определение *s и **substrings являются правильными.

И мне нужно назначить указатели *s такие как **substrings будет содержать:

{ "", "ab", "c", "" } 

Формальное определение подстрок

substrings - the array to populate with pointers to substrings of s 

Я не знаю, я гугле двойной заостренный и не мог выяснить.

Размер *s неизвестен, а число **substrings известно только при выполнении программы.

Я новичок в C, но я думаю, что мне нужно что-то вроде этого:

substrings[0][0] = ""; 
substrings[1][0] = "a"; 
substrings[1][1] = "c"; 
substrings[2][0] = "c"; 
substrings[3][0] = "a"; 
+0

В фрагменте кода, который вы только что показали - вы не выделяете пространство ни для указателей строк, ни для строк. – Kamiccolo

+0

Должен ли я найти память в функции split, я попытался выделить с помощью malloc, но получил ошибку памяти (core dumped) – Jonhhan

+0

, так что, могли бы вы показать нам, что на самом деле вы пробовали, пожалуйста? Да, все в порядке. Несмотря на это, не лучшая практика. – Kamiccolo

ответ

1

Неясно, что семантика вашей split() рутины но я предполагаю, что ваш substrings должен быть массивом указателей:

#define MAX_TOKENS 16 /* for example */ 
char* substrings[MAX_TOKENS]; 

split(s, ..., substrings, MAX_TOKENS); 
+0

, так что вы говорите, что размер должен быть предварительно установлен как MAX_TOKENS перед компиляцией программы, он не может быть передан из stdin или файла? – Jonhhan

+0

Это может быть, конечно, но вам придется выделять _an массив указателей_ заданного размера. Во многих случаях, когда вы уверены, что количество токенов ограничено, проще просто фиксировать максимальный размер. –

0

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

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

    char** substrings = (char**)calloc(strlen(s), sizeof(char)); 
    if (substrings == NULL) exit(1); 

    // Split here 

На данный момент у вас есть структура данных, которая содержит указатели на строки strlen (s). Когда вы разделите строку, вы будете перебирать эти указатели и назначать каждому указателю новую найденную подстроку.

+0

http://pastebin.com/49pN2weK вы можете мне помочь? – Jonhhan

0

Как вы не знаете, количество подстрок или размер каждой подстроки заранее, я бы предложил использовать calloc принимая во внимание худшем случае, это:

substrings = calloc(strlen(s), strlen(s)*sizeof(char)); 

sizeof(char) должен быть 1, но я включил это просто по дидактическим причинам.

О лучшем способе реализации split функции, я думаю, что лучшее решение будет использовать strchr, было бы что-то подобное:

int split(char *s, int start, char sep, char **substrings, int max) 
{ 
    char *old, *sp; 
    int i=0; 
    old=s; 

    sp=strchr(old,sep);  
    while (sp!=NULL && i < max) 
    { 
     if(0 < (sp-old)) 
      strncpy(substrings+i++, old, sp - old); 
     old = sp+1; 
     sp=strchr(old,sep); 
    } 

    // Last sub string 
    if(0 < (s+strlen(s)-old)) 
     strncpy(substrings+i++, old, s+strlen(s)-old); 

    return i; 
} 

Для вашего предполагаемого входа, это решение будет сбрасывать массив, содержащий: {"ab","c"} ,

Я предположил, что max определяет максимально допустимое количество подстрок и что каждый элемент в substrings имеет пространство, достаточное для хранения соответствующей подстроки (оба условия выполнены с ранее предложенными calloc).

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