2017-03-20 13 views
-1
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

void split_line(char **fields, char *line); 

int main() { 
    char *fields[5]; 
    char *line = "donuts,are,cool,and,tasty"; 
    int i = 0; 

    split_line(fields, line); 

    return 0; 
} 

void split_line(char **fields, char *line) { 
    int i = 0; 
    char *token, *delim; 
    delim = ",\n"; 
    token = strtok(line, delim); 
    while (token) { 
     fields[i] = malloc(strlen(token)); 
     strcpy(fields[i], token); 
     token = strtok(NULL, delim); 
     i++; 
    } 

} 

저는 C를 처음 사용하며 한시간 동안이 오류를 해결하는 방법을 찾기 위해 노력해 왔습니다. 그것은 컴파일하지만 실행 시간에 나는 사람이 이런 일이 내가 잘못하고있는 무슨 이유에 저를 이끌 수 있다면버스 오류 : C 프로그램에서 10 개, 이유를 알아낼 수 없습니다.

Bus Error: 10.

내가 감사하겠습니다 얻을.

+2

디버거 사용 Luke – immibis

+0

'fields '에는 5 개 이상의 항목이 없다는 믿음이 많이 있습니다. 당신이 그것의 범위를 초과하는 경우에 그것은 추악해질 것입니다. – tadman

답변

0

문자열 리터럴을 수정할 수 없으므로 올바르지 않습니다. 또한이

char line[] = "donuts,are,cool,and,tasty"; 

같은 시도 strtok() 그렇게 않기 때문에, 입력 문자열을 수정하지 않고 이에 대한 strtok()이 아닌 다른 뭔가를 배우려고하면 오류가 점점 이유입니다.

는 권고가로서, 항상 당신이 나쁜 일을하려고하는 것을 알 도움이됩니다 문자열 리터럴

const char *line = "donuts,are,cool,and,tasty"; 

컴파일러에 대한 const를 사용합니다.

또한 malloc()보다 적은 문자가 필요합니다. 문자열은 길이가 문자 +1이어야하며 마지막 문자는 null 종결 자이며 데이터를 문자열로 사용하려면 항상 str 함수에이 값이 있어야하므로 할당해야합니다. 그것을위한 공간도 복사하십시오.

size_t length = strlen(token); 
fields[i] = malloc(length + 1); 
if (fields[i] != NULL) { 
    strcpy(fields[i], token); 
} 
+2

사실이긴하지만 다시 한번 "코드 벽"질문으로 더 많은 것이 있습니다 :'fields [i] = malloc (strlen (token));'은 충분한 메모리를 할당하지 않습니다 ... 컴퓨터에서 작동합니다. –

+1

@ Jean-FrançoisFabre 오프 바이 한 에러가 다시 발생합니다! – tadman

+0

@tadman 너무 일반적입니다 ... –

0

아마도 당신이 잘못 할당 한 것 같습니다. 당신이 strdup에 액세스 할 수있는 경우, 그것을 사용해보십시오 :

fields[i] = strdup(token); 

당신은 결국 할당 된 메모리를 해제 할 책임이 있습니다.