이 질문은 실제로 this topic에 가깝지만이 솔루션에서 제공하는 lisibility 및 포인터 설명을 선호합니다.문자열을 문자열 배열로 분할하면 동적으로 할당됩니다.
데이터 파일이 있는데 그 파일에서 매우 긴 배열을 가져옵니다. 이 문자열을 배열로 나눠서이 파일의 한 줄에 해당하는 문자열을 넣고 싶습니다.
솔루션을 보았지만 각 라인의 길이를 알지 못하기 때문에 제한된 배열을 사용합니다. 실제로 모든 것을 동적으로 할당해야하지만 strtok
은 입력하지 않기 때문에 라인의 길이를 찾을 수 없습니다. 각 문자열의 끝 부분에 널 문자 \0
이 있습니다.
int get_lines(char *file, char **lines) {
int nb_lines = 0;
char *token = strtok(file, "\n");
for(int i = 0; token != NULL; i++) {
token = strtok(NULL, "\n");
nb_lines = i;
}
nb_lines++;
lines = malloc((nb_lines + 1) * sizeof(char*));
lines[nb_lines] = '\0';
token = strtok(file, "\n");
for(int i = 0; token != NULL; i++) {
token = strtok(NULL, "\n");
int nb_char = 0;
for(int j = 0; token[j] != '\n'; j++) //This will cause SIGSEGV because strtok don't keep the '\n' at the end
nb_char = j;
nb_char++;
token[nb_char] = '\0'; //This cause SIGSEGV because token's allocation finish at [nb_char-1]
lines[i] = malloc(strlen(token) * sizeof(char)); //strlen cause SIGSEGV because I cannot place the '\0' at the end of token
printf("%s", token); //SIGSEGV because printf don't find the '\0'
lines[i] = token;
}
for(int i = 0; i < nb_lines; i++) {
printf("%s", lines[i]); //SIGSEGV
}
return nb_lines;
}
그래서 당신은 내가 뭘 원하는지의 생각 이상으로 볼 수 있으며 작동하지 않는 이유 : 내가 지금 가지고 무엇
이 두 가지 솔루션을하지만, 어느 작품이다. 아래에서
내가 만든 다른 시도를 볼 수 있지만 같은 지점에서 붙어 :
int count_subtrings(char* string, char* separator) {
int nb_lines = 0;
char *token = strtok(string, separator);
for(int i = 0; token != NULL; i++) {
token = strtok(NULL, separator);
nb_lines = i;
}
return nb_lines + 1;
}
char** split_string(char* string, char* separator) {
char **sub_strings = malloc((count_subtrings(string, separator) + 1) * sizeof(char*));
for(int i = 0; string[i] != EOF; i++) {
//How to get the string[i] lenght to malloc them ?
}
}
내 파일이 매우 크고 라인도 할 수 있도록 내가를 malloc을하고 싶지 않아 (strlen(file) + 1) * sizeof(char)
의 크기를 가진 다른 테이블은 각 행이 SIGSEGV가 아닐 것이고 나는 또한이 해결책이 상당히 더럽다는 것을 알게 될 것입니다. 만약 여러분들이 다른 생각을 가지고 있다면, 나는 정말로 행복 할 것입니다. 한 번만 원래 문자열을 전달할 수 있도록 첫째, strtok
는 문자열을 수정합니다
가능한 복제 (http://stackoverflow.com/questions/43779687/handle-memory-while-reading-long-lines-from-a -file-in-c) – Badda
동적 연결 목록 종류의 데이터 구조를 사용할 수 있습니다. –
realloc 체크 아웃 –