如上所述,我碰巧在为char数组分配内存时出现问题。分配内存的关键是我想读取一个.txt文件并将其全部保存在一个char数组中以便以后使用它。 (寻找最大的重复字符串)
我现在已经在互联网上找了2个多小时才发布,但是我无法让它工作似乎我错过了一些东西,或者只是不完全理解指针是如何工作的,我真的没有。
评论是德语,就像我希望没有人想到的一些变量。
以下是代码:
# include <stdio.h>
# include <stdlib.h>
# include <math.h>
# include <string.h>
# include <ctype.h>
# define N 99
# define K 255
main() {
FILE *Test;
long len = 1;
int i = 0;
int k;
// char String[N]; //[100][255] = {" "};
// char* pString;
// pString = String;
Test = fopen("Moby_Dick.txt", "r"); // Datei öffnen, r = lesen | (nicht vergessen DATEINAMEN anzupassen)
if (fseek(Test, 0L, SEEK_END) != 0) { //jump ans Ende
printf("\nFEHLER in SEEK_END");
fclose(Test);
return 3;
}
if ((len = ftell(Test)) < 0L) {
printf("\nERROR in ftell");
fclose(Test);
return 3;
}
if (fseek(Test, 0L, SEEK_SET) != 0) { // jump an den Anfang
printf("\nERROR in SEEK_SET");
fclose(Test);
return 3;
}
char *String = (char*)malloc(sizeof(char)*len + 12); //(char*)
Test = fopen("Eingabe.txt", "r");
do{
fgets(String[i], 500, Test); // jede Zeile wird in einem Feld gespeichert
i++; // zählt die Zeilen hoch
}while(!feof(Test)); // lese bis Dateiende
fclose(Test); // Datei schliessen
for (k = 0; k < 20; k++) {
printf("%s\n----------------------------\n", String[k]);
}
printf("len = %d\n", len);
return 0;
}
感谢您提供的任何帮助。我想要一个解释,而不是只是传递代码。
答案 0 :(得分:2)
分配数组后,您可以在单个函数调用中读取整个文件:
FILE* file = fopen("Moby_Dick.txt","rt");
fseek(file,0,SEEK_END);
int size = ftell(file);
fseek(file,0,SEEK_SET);
char* string = (char*)malloc(size+1);
fread(string,size,1,file);
fclose(file);
string[size] = 0;
printf("%s",string);
free(string);
答案 1 :(得分:1)
一些想法
使用ftell()/fseek()
不是一种便携式,也不是查找文件长度的好方法。修复需要在这里做大量工作。现在,让它成为,但知道更好的方法存在。
不需要演员malloc()
。额外的12个字节是任意的,不需要。 sizeof(char)
总是1.如果有任何人使用sizeof(*String)
。
// char *String = (char*) malloc(sizeof(char) * len + 12); //(char*)
char *String = malloc(len * sizeof(*String));
// or
char *String = malloc(len);
循环do{ fgets(String[i] ... while(!feof(Test));
有很多问题。最好做一些@barak manos建议的事情
// fgets(String[i], 500, Test);
if (1 != fread(string,size,1,file)) {
Handle_Readfailure();
}
匹配您的格式
// printf("len = %d\n", len);
printf("len = %ld\n", len);
但解决了上述小问题后,这种方法可能会有所改善。你的目标:
读取一个.txt文件并保存所有文件..以便以后使用它。 (寻找最大的重复字符串)
要完成此建议:
以下未经过测试,并且缺少一些错误处理。有改进性能的空间。但它不依赖Test
作为文件,它可能是像stdin
这样的流。需要添加free()
- 缓冲区。它假定最大行长度为1024;
// Read lines
size_t LineCount = 0;
size_t LineSize = 0;
char **Line = NULL;
char buffer[1024];
while (fgets(buffer, sizeof buffer, Test) != NULL) {
if (LineCount >= LineSize) {
LineSize = LineSize*2 + 1;
Line = realloc(Line, LineSize * sizeof(*Line)); // TBD error handling
}
size_t len = strlen(buffer);
if (len > 0 && buffer[len - 1] == '\n') buffer[--len] = '\0';
len++;
Line[LineCount] = malloc(len);
memcpy(Line[LineCount], buffer, len);
LineCount++;
}
fclose(Test);
// search lines
size_t Longest = 0;
size_t Index = 0;
for (size_t i=0; i<LineCount; i++) {
size_t leni = strlen(Line[i]) + 1;
if (leni <= Longest) continue; // line too short to beat the best.
for (size_t j=0; j<i; j++) {
if (strcmp(Line[i], Line[j]) == 0) { // duplicate found
Longest = leni;
Index = i;
break;// skip checking Line[i] against Line[j+1] to Line[i-1]
}
}
}
if (Longest > 0) {
printf("Longest duplicate line is \"%s\".\n", Line[Index]);
}
else {
printf("No duplicates found.\n");
}