提问人:André Ferreira 提问时间:4/24/2022 最后编辑:André Ferreira 更新时间:4/24/2022 访问量:60
C- 字符串数组的动态内存分配问题
C- Dynamic memory allocation for an array of strings problem
问:
我正在处理一个项目,我需要动态分配一个字符串数组。每个字符串都是 csv 文件中的一行。问题在于,在最后一个数组上,数组的每个字符串(最后一个字符串)都是乱码。我还在学习指针,我无法弄清楚发生了什么。
CSV 文件:
ZeManel,10032003,7,B,12,50
AntonioSilva,03102002,8,A,23,15
AlbinoFerreira,25122001,9,C,2,31
AntonioSilva,14112000,12,E,1,89.4
法典:
void sorting(){
FILE *fp = fopen("C://Users//G512L//CLionProjects//ProjetoPPP//active_students.csv", "r"), *fp_temp = ("C://Users//G512L//CLionProjects//ProjetoPPP//active_students.csv", "w");
char str[MAXCHAR], **strings, buffer[MAXCHAR];
int lines_count = 0, ctrl = 0, length = 0;
if(fp == NULL) {error_op_fl();}
else{
while(fgets(str, MAXCHAR, fp) != NULL){
lines_count++;
}
rewind(fp);
while(fgets(buffer, MAXCHAR, fp) != NULL) {
strings = malloc(lines_count * sizeof(char *));
length = strlen(buffer);
buffer[length] = '\0';
strings[ctrl] = malloc(length * sizeof(char));
strcpy(strings[ctrl], buffer);
ctrl++;
}
for(int x = 0; x < lines_count; x++){
printf("%s\n", strings[x]);
}
}
free(strings);
输出:
P☺3┌↓☻
░x3┌↓☻
(null)
AntonioSilva,14112000,12,E,1,89.4
输出的最后一行是唯一正确的一行
答:
0赞
pm100
4/24/2022
#1
您正在每一行上重新分配外部数组
while(fgets(buffer, MAXCHAR, fp) != NULL) {
strings = malloc(lines_count * sizeof(char *)); <<<<=====
length = strlen(buffer);
buffer[length] = '\0';
strings[ctrl] = malloc(length * sizeof(char));
strcpy(strings[ctrl], buffer);
ctrl++;
}
这应该只做一次,加上字符串需要 +1
strings = malloc(lines_count * sizeof(char *));
while(fgets(buffer, MAXCHAR, fp) != NULL) {
length = strlen(buffer);
//buffer[length] = '\0'; <<< === not useful since strlen tells you the location of terminating null
strings[ctrl] = malloc((length + 1) * sizeof(char)); <<<=== +1
strcpy(strings[ctrl], buffer);
ctrl++;
}
上一个:如何在结构中存储未知大小的值数组
评论
"w"
active_students.csv
getline
?如果您使用的是 POSIX 兼容系统(LInux、macOS、BSD,基本上除了 Windows 之外的几乎所有系统)或支持 C 动态内存 TR 的实现,这将使这项任务变得更加简单。