2013-02-25 6 views
1

Я пытаюсь получить строку за строкой из строки (char *). Я попытался реализовать его из того, что я читал в Интернете, но он не работает. Я написал этот тестовый код, чтобы заставить его работать вне моего кода проекта, и он все еще не работает (seg faults при первом вызове readline).Как получить строку из строки?

Заранее благодарим за любую помощь!

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

static void parse_message(char *message); 
static void readline(char *message, char *line, int *counter); 

int main(int argc, char *argv[]){ 

    printf("starting\n"); 


    char *message1 = "Chat {\nHey what's up do you like zebras?\n}\n"; 

    parse_message(message1); 

    printf("Finished\n"); 
    return EXIT_SUCCESS; 
} 


static void parse_message(char *message){ 
    char *line = (char *) malloc (50 * sizeof(char)); 
    int *counter = 0; 

    readline(message, line, counter);//read in first line 

    if(strcmp(line, "CHAT {") == 0){ 
     readline(message, line, counter); //read in message 
     printf("%s",message); //print message 
     readline(message,line,counter); //read in close bracket 
    } else{ 

     printf("Error occurred\n"); 
    } 


} 


static void readline(char *message, char *line, int *counter){ 

    int index = 0; 
    while(message[*counter] != '\n'){ 
     line[index] = message[*counter]; 
     counter++; 
     index ++; 
    } 
} 
+0

Вы говорите о ошибке сегментации, но я запустить его и он печатается «произошла ошибка» – kirugan

ответ

1

Существует несколько ошибок.

В parse_message вы должны сравнить «сообщение» с «CHAT {». Кроме того, strcmp не будет возвращать 0, поскольку две строки не идентичны. Вместо этого используйте strncmp.

int * counter = 0 означает указатель 0. Вы должны просто использовать «int» и вместо этого передать адрес счетчика.

В readline(), вам нужно опустить конец строки. * счетчик ++ должен быть (* счетчик) ++. В противном случае вы увеличиваете указатель, но не содержание указателя.

static void parse_message(char *message) { 
    char *line = (char *) malloc (50 * sizeof(char)); 
    int counter = 0; 
    char *startline = "Chat {"; 
    if(strncmp(message, startline, strlen(startline)) == 0){ 
     readline(message, line, &counter); //read in message 
     printf("%s",message); //print message 
     readline(message,line,&counter); //read in close bracket 
    } else{ 
     printf("Error occurred\n"); 
    } 
} 


static void readline(char *message, char *line, int *counter){ 
    int index = 0; 
    while(message[*counter] != '\n'){ 
     line[index] = message[*counter]; 
     (*counter)++; 
     index ++; 
    } 
    line[index] = 0; 
} 
+1

+1: Хороший анализа. Код может использовать 'strchr()' для поиска новых строк. –

+0

Я рекомендую использовать [strtok] (http://www.cplusplus.com/reference/cstring/strtok/) –

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