2016-11-23 11 views
-1

임의의 인덱스 주위에서 문자열을 구문 분석하려고합니다. 내 간단한 테스트 프로그램에서 나는 입력 문자열을 읽고 나서 memcpy를 사용하여 문자열을 구문 분석했다.Segfault가 char *를 토큰으로 구문 분석 중

테스트를 위해 입력란에 "this text"를 입력하고 있습니다. 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; 
} 

그러나 token1이 아닌 token2를 사용하도록 두 번째 memcpy를 변경하면 세그먼트 오류가 발생합니다. 왜 이런거야?

+0

어느'token1' 느와르'token2'가 초기화 당신의로 원하는 부분을 복사 . 따라서 그들에게'memcpy '할 때, 당신은 무작위 로케 케이 언에 복사하고, 당신은 실패합니다. – NickStoughton

+0

'memcpy (token1, inputBuffer, 4);'는'token'에 할당 된 메모리가 없습니다. –

답변

1

token1에 대한 메모리를 할당해야 할 가능성이 큽니다. 라인에

#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