我正在尝试从文件中读取字符串并将它们插入矩阵中。每一行都是一个单词。
FILE *fp = fopen("zadanie4.txt","r");
if( fp == NULL)
{
perror("Error while opening the file.n");
exit(EXIT_FAILURE);
}
int symbol, num_of_lines = 0, len_of_string = 0, max_len = 0;
do {
symbol = fgetc(fp);
len_of_string++;
if (symbol == 'n' || feof(fp)) {
num_of_lines++;
if(len_of_string > max_len){
max_len = len_of_string;
}
len_of_string = 0;
}
} while (symbol != EOF);
fclose(fp);
printf("Number of words: %dn", num_of_lines);
printf("Longest word: %dn", max_len);
fp = fopen("zadanie4.txt","r");
char (*arr)[num_of_lines] = calloc(num_of_lines, sizeof(char*) * max_len);
int index = 0;
while(fscanf(fp, "%s", arr[index++]) == 1) {
printf("%sn", arr[index - 1]); //first check to see what is written into array
}
close(fp);
printf("--------------------------n");
int i;
for(i = 0; i < num_of_lines; i++){
printf("%sn", arr[i]); //second check
}
我找出最长字符串的大小,并为字符串的数量*最长字符串分配内存。
以下是如果最长单词为5(+1表示空"\0")时的输出情况:
Number of words: 6
Longest word: 6
AAAAA
BBBBB
CCCCC
DDDDD
EEEEE
FFFFF
--------------------------
AAAAA
BBBBB
CCCCC
DDDDD
EEEEE
FFFFF
如果我在每行中添加另一个字符:
Number of words: 6
Longest word: 7
AAAAAa
BBBBBb
CCCCCc
DDDDDd
EEEEEe
FFFFFf
--------------------------
AAAAAaBBBBBbCCCCCcDDDDDdEEEEEeFFFFFf
BBBBBbCCCCCcDDDDDdEEEEEeFFFFFf
CCCCCcDDDDDdEEEEEeFFFFFf
DDDDDdEEEEEeFFFFFf
EEEEEeFFFFFf
FFFFFf
注意:在这个例子中,每个字符串都是相同的大小,但我希望它适用于各种大小。
有人能帮助我如何为这个数组正确分配内存吗?
您对arr
的声明和分配是错误的,不匹配。
您将arr
声明为指向num_of_lines
字符数组的指针。然后为字符分配max_len
数量的指针。
外部和内部阵列都可以使用可变长度阵列:
char arr[num_of_lines][max_len + 1]; // +1 for string terminator
根本不需要动态分配。
我相信您并不真正了解calloc
是如何工作的。不能使用将内存分配给数组的成员
char (*arr)[num_of_lines] = calloc(num_of_lines, sizeof(char*) * max_len);
calloc
的第一个参数将是为阵列分配的块数量,第二个参数将为每个块的大小(以字节为单位)。
相反,你想定义这样的数组
char *arr[num_of_lines];
现在,您需要遍历每个成员并为其分配内存
for(int i = 0; i < num_of_lines; i++) {
arr[i] = malloc(sizeof(char) * max_len);
}
或者,您可以将数组定义为静态数组,因为您知道max_len的大小。
您之所以看到这种行为,是因为在添加额外字符时,您在每个字符串的末尾重写了字符串终止符(null character==0)。
您不需要使用一个连续的内存块,而是需要保留一个字符串指针数组,并分别分配每个字符串:
char *strings[];
strings = calloc(sizeof(char*),NUMBER_OF_STRINGS);
for i = 0; i < NUMBER_OF_STRINGS; i++ {
strings[i] = calloc(sizeof(char), MAX_STRING_LENGTH+1);
}
然后,当您想向字符串中添加一个字符时,如果新的总数小于最大字符串长度,请使用strcat:
strcat(strings[i],"-suffix");
或者,如果时间更长,则需要重新分配存储:
strings[i] = realloc(strings[i], MAX_STRING_LEN+EXTRA_BYTES+1);
strcat(strings[i],"-suffix");