【发布时间】:2017-10-03 20:47:15
【问题描述】:
这个问题与this topic 非常接近,但我更喜欢这个解决方案提供的易懂性和我需要的指针说明。
所以我有一个数据文件,我从中得到了一个很长的字符数组。我想将此字符串拆分为一个数组,在每种情况下,一个字符串对应于该文件的一行。
我看到了解决方案,但它们都使用有限的数组,因为我不知道每行的长度,我真的需要动态分配它们,但我找不到行的长度,因为strtokdoesn't put一个空字符\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,而且我也发现这个解决方案很脏,如果你们有其他想法,我会很高兴的。
(对不起英文错误,我不是很好)
【问题讨论】:
-
您可以使用动态链表类型的数据结构。
-
查看 realloc
-
使用
getline()逐行读取文件。将生成的行指针复制到char*数组中的下一个条目在每次调用getline()之前将行指针重置回NULL,建议char*数组动态分配,这样可以在/时调用realloc()如果数组已满。 -
感谢@user3629249,但我将使用已检查的 awnser,因为我已经将文件加载到一个数组中,我想知道如何拆分它,即使您的 awnser 也可以正常工作。
标签: c arrays string dynamic-allocation