基于字符串比较的单词翻译程序——堆内存断言失败
Word translator program based on string comparison - heap memory assertion fails
我制作了一个程序,它从文件 english_dictionary.txt
中读取 200 个最常用的英语单词,并在 foreign_dictionary.txt
中将各个单词的翻译翻译成外语。
.txt 文件的内容放置在两个 char *
类型的 200
元素数组中。
然后程序从文件 text_to_translate.txt
中读取包含英文文本的文件,如果找到匹配项,则将英文字符串(单词)替换为外国字符串(这发生在 compute_text
函数)。但它不起作用,我对堆内存断言失败,所以我想我用 malloc 或类似的东西出了问题,但我不明白我错在哪里。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
void foreign_dictionary(char **foreign, FILE *fp){
char *buffer = malloc(30 * sizeof(char));
char *tok;
int i;
for (i = 0; i < 200; ++i){
fgets(buffer, 29, fp);
tok = strtok(buffer, "\n");
foreign[i] = malloc(strlen(tok) + 1);
strcpy(foreign[i], tok);
}
free(tok);
free(buffer);
}
void dictionary(char **english, FILE *fp){
int i;
char *tok;
char *buffer = malloc(30 * sizeof(char));
for (i = 0; i < 200; ++i){
fgets(buffer, 29, fp);
tok = strtok(buffer, " \n");
english[i] = malloc(strlen(tok) + 1);
strcpy(english[i], tok);
}
free(buffer);
free(tok);
}
void compute_text(char **text,FILE *fp){
char *buffer;
int i, j, flag = 0, words_number = 0, cnt_letters_word = 0;
buffer = malloc(100 * sizeof(char));
while (fgets(buffer, 100, fp) != NULL){
for (i = 0; i < 100; ++i){
if (buffer[i] == ' ' || buffer[i] == '[=10=]'){
text[words_number] = malloc((cnt_letters_word + 1)* sizeof(char));
for (j = 0; j < cnt_letters_word; ++j){
if (isupper(buffer[flag + j]))
text[words_number][j] = tolower(buffer[flag + j]);
else
text[words_number][j] = buffer[flag + j];
}
text[words_number][cnt_letters_word] = '[=10=]';
flag = i + 1;
cnt_letters_word = 0;
++words_number;
}
else if (buffer[i] == '\n' || buffer[i] == ',' || buffer[i] == '.' || buffer[i] == ';' || buffer[i] == ':')
;
else
++cnt_letters_word;
}
flag = 0;
cnt_letters_word = 0;
}
free(buffer);
}
int main(void){
char *foreign[200], *english[200], *text[50];
FILE *fp = fopen("foreign_dictionary.txt", "r");
foreign_dictionary(foreign, fp);
fclose(fp);
fp = fopen("english_dictionary.txt", "r");
dictionary(english, fp);
fclose(fp);
fp = fopen("text_to_translate.txt", "r");
compute_text(text, fp);
fclose(fp);
return 0;
}
在您的代码中,tok
没有指向动态分配的内存。您不需要(也不能)free()
它。移除
free(tok);
来自代码。
The free(ptr)
function frees the memory space pointed to by ptr
, which must have been returned by a previous call to malloc()
, calloc()
or realloc()
. Otherwise, or if free(ptr)
has already been called before, undefined behaviour.
occurs.
就是说,在使用 returned 指针之前,始终检查 fopen()
和 malloc()
的 return 值(可能还有所有库函数)以确保成功.
我制作了一个程序,它从文件 english_dictionary.txt
中读取 200 个最常用的英语单词,并在 foreign_dictionary.txt
中将各个单词的翻译翻译成外语。
.txt 文件的内容放置在两个 char *
类型的 200
元素数组中。
然后程序从文件 text_to_translate.txt
中读取包含英文文本的文件,如果找到匹配项,则将英文字符串(单词)替换为外国字符串(这发生在 compute_text
函数)。但它不起作用,我对堆内存断言失败,所以我想我用 malloc 或类似的东西出了问题,但我不明白我错在哪里。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
void foreign_dictionary(char **foreign, FILE *fp){
char *buffer = malloc(30 * sizeof(char));
char *tok;
int i;
for (i = 0; i < 200; ++i){
fgets(buffer, 29, fp);
tok = strtok(buffer, "\n");
foreign[i] = malloc(strlen(tok) + 1);
strcpy(foreign[i], tok);
}
free(tok);
free(buffer);
}
void dictionary(char **english, FILE *fp){
int i;
char *tok;
char *buffer = malloc(30 * sizeof(char));
for (i = 0; i < 200; ++i){
fgets(buffer, 29, fp);
tok = strtok(buffer, " \n");
english[i] = malloc(strlen(tok) + 1);
strcpy(english[i], tok);
}
free(buffer);
free(tok);
}
void compute_text(char **text,FILE *fp){
char *buffer;
int i, j, flag = 0, words_number = 0, cnt_letters_word = 0;
buffer = malloc(100 * sizeof(char));
while (fgets(buffer, 100, fp) != NULL){
for (i = 0; i < 100; ++i){
if (buffer[i] == ' ' || buffer[i] == '[=10=]'){
text[words_number] = malloc((cnt_letters_word + 1)* sizeof(char));
for (j = 0; j < cnt_letters_word; ++j){
if (isupper(buffer[flag + j]))
text[words_number][j] = tolower(buffer[flag + j]);
else
text[words_number][j] = buffer[flag + j];
}
text[words_number][cnt_letters_word] = '[=10=]';
flag = i + 1;
cnt_letters_word = 0;
++words_number;
}
else if (buffer[i] == '\n' || buffer[i] == ',' || buffer[i] == '.' || buffer[i] == ';' || buffer[i] == ':')
;
else
++cnt_letters_word;
}
flag = 0;
cnt_letters_word = 0;
}
free(buffer);
}
int main(void){
char *foreign[200], *english[200], *text[50];
FILE *fp = fopen("foreign_dictionary.txt", "r");
foreign_dictionary(foreign, fp);
fclose(fp);
fp = fopen("english_dictionary.txt", "r");
dictionary(english, fp);
fclose(fp);
fp = fopen("text_to_translate.txt", "r");
compute_text(text, fp);
fclose(fp);
return 0;
}
在您的代码中,tok
没有指向动态分配的内存。您不需要(也不能)free()
它。移除
free(tok);
来自代码。
The
free(ptr)
function frees the memory space pointed to byptr
, which must have been returned by a previous call tomalloc()
,calloc()
orrealloc()
. Otherwise, or iffree(ptr)
has already been called before, undefined behaviour. occurs.
就是说,在使用 returned 指针之前,始终检查 fopen()
和 malloc()
的 return 值(可能还有所有库函数)以确保成功.