2016-11-23 2 views
-1

Я пытаюсь разобрать строку вокруг произвольного индекса. В моей простейшей тестовой программе я мог придумать, что у меня есть строка ввода, которую я прочитал, а затем сделаю memcpy для синтаксического анализа строки.Segfault в анализе char * в токенах

Для проверки этого я набираю текст «этот текст» в качестве ввода. readInput - это функция, в которой у меня есть только вызов getline (& ввода, & размер, stdnin) и возврат указателя ввода.

int main(){ 
    char *input; 
    input = readInput(); 

    int parseAround = 4; 
    char *token1; 
    char *token2; 

    memcpy(token1, inputBuffer, 4); 
    printf("token: %s\n", token1); //prints "this" 

    memcpy(token1, inputBuffer + (parseAround+1), 4); 
    //when changed to memcpy(token2,...); segfaults 
    printf("token: %s\n", token1); //prints "text" 


    free(input); 
    return 0; 
} 

Однако, когда я изменить второй тетср использовать token2, а не token1, я получаю ошибку сегментации. Почему это?

+0

Ни '' token1' нуар token2' инициализируется ... они указывают на случайных местах , Таким образом, когда вы «memcpy» к ним, вы копируете случайную локализацию, и вы segfault. – NickStoughton

+0

'memcpy (token1, inputBuffer, 4);' не имеет памяти, выделенной для 'токена'. –

ответ

1

Скорее всего, вам необходимо выделить память для токена1.

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

int main(){ 
    char *input = NULL; 

    size_t len = 0; 
    ssize_t read; 

    /* Read in the line "Hello world" */ 
    read = getline(&input, &len, stdin); 
    printf("Retrieved line of length %zu :\n", read); 
    printf("%s", input); 

    /* Allocate memory for both parts of the string */ 
    char *token1 = malloc((read+1) * sizeof(char *)); 
    char *token2 = malloc((read+1) * sizeof(char *)); 

    memcpy(token1, input, 6); 
    printf("token: %s\n", token1); //prints "Hello" 

    memcpy(token2, (input+6), 5); 
    printf("token: %s\n", token2); //prints "world" 

    free(input); 
    return 0; 
} 

Читайте в строке, выделить память для каждой части строки, а затем скопировать часть, которую вы хотите в вашем с

+0

'getline' возвращает количество прочитанных символов, но не включает завершающий нулевой байт ('\ 0'). Поэтому вы должны добавить его в пространство, выделенное malloc(), чтобы удерживать этот ограничитель строк. – NickStoughton

+0

@NickStoughton Отредактировано, спасибо. – Chirality

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