【发布时间】:2016-04-27 11:06:30
【问题描述】:
您好,我的内存分配有问题,
-
1.打开文件
-
2. 把里面的文字拉长
-
3.制作长度大小的缓冲区(数组[]?malloc?)
-
4.对缓冲区中的文本进行操作。
-
5. 关闭
当文本超过 1xx 个字符时它会终止,我不知道发生了什么。
ps.注意!我的学习和这段代码的质量可能很差
#include <stdio.h>
#include <stdlib.h>
void copy_to_buffer(FILE *fp, int length, char *buffer){
for(int i = 0; i < length; i++){
char c = fgetc(fp);
buffer[i] = c;
}
}
int length_of_text(FILE *fp) {
fseek(fp, 0L, SEEK_END);
int size = ftell(fp);
rewind(fp);
return size;
}
void char_counter(int length, char *buffer, int *charBuffer) {
int counts[128] = { 0 };
for (int i = 0; i < length; i++) {
counts[(int)(buffer[i])]++;
charBuffer[i] = counts[i];
}
for (int i = 0; i < 128; i++) {
charBuffer[i] = counts[i];
if(counts[i] != 0)
printf("%d.(%c) counted: %d times.\n", i,i, counts[i]);
}
}
/***********************************MAIN***********************************/
int main(int argc, char** argv) {
FILE *fp = fopen("tekst.txt" , "r");
int length = length_of_text(fp); //lenght of text
char *buffer = malloc(sizeof(char)*length); //buffer for text from file
if(buffer == NULL)
printf("error");
else
printf("alocated at = %p\n", &buffer);
int charBuffer[128] = {0}; // charcount buffer
buffer[length] = '\0'; // '\0' after last sign
copy_to_buffer(fp, length, buffer);
char_counter(length, buffer, charBuffer);
free(buffer);
fclose(fp);
return 0;
}
【问题讨论】:
-
旁白:
printf("alocated at = %p\n", &buffer);-->printf("alocated at = %p\n", (void*)buffer); -
其中一个问题在于这一行 -
counts [ (int)(buffer[i]) ]++当您将 char 转换为 int 时,它会为您提供 ascii 表示,而不是您看到的被转换为数字的实际 char。 -
buffer[length] = '\0';越界。 -
tekst.txt是7位码吗? -
@ShadyProgrammer:我猜这就是这个程序的目的。 (当文本文件包含纯 ASCII 范围之外的字符时,我预见到巨大的问题。也许这不是问题,但又可能是。)