bebas dari deretan string error dengan "Heap has been corrupt"
Program C ini membaca file dengan kata per baris. Saya ingin menghitung kata-kata unik dari file tersebut dan menyimpannya dalam totalwords, yang diteruskan dengan referensi dari fungsi pemanggil. Program ini membuat serangkaian string untuk menyimpan kata-kata yang belum dibaca. Ada fungsi lain, cukup sederhana, yang memeriksa apakah sebuah kata sudah terdapat dalam larik string, disebut isContained (), lihat di akhir posting ini. Semua tampaknya berfungsi dengan baik, dan saya bahkan memeriksa bahwa kata-kata tersebut secara konsisten disimpan dalam array sebagai kata-kata unik. Namun, ketika membebaskan array, kesalahan "" Sebuah tumpukan telah rusak "muncul dan program macet. Maaf jika ini pertanyaan pemula, tetapi saya memeriksa ulang dan saya tidak dapat menemukan di mana kesalahannya.
Terima kasih banyak sebelumnya
Koreksi dilakukan setelah komentar (maaf, saya harus membersihkan beberapa bagian dari kode asli untuk memposting contoh): @Some programmer dude, @ryyker, @kiran biradar, @mlp: Saya menghapus deklarasi baris yang digandakan dan menambahkan yang gratis (garis) di akhir. Saya juga menyediakan ruang untuk penghentian string. numrecords telah dihapus (itu adalah bagian dari kode asli yang dihapus untuk klarifikasi). Saya menggunakan Visual Studio 2019, tidak ada kesalahan yang muncul dalam mode debug, hanya 4 peringatan. Mungkin aku melakukan sesuatu yang salah. Ukuran (char) dihapus.
Terima kasih semua. Saya periksa lagi. Itu karena malloc lain untuk string tanpa karakter penghentian tambahan. Masalah terpecahkan. Terima kasih banyak!
int fileProcessing(char* file_in, int* totalwords) {
FILE* streamVec;
char* line = malloc(200);
int i=0;
int numberoflines=1000;
char** currentList = malloc(numberoflines* sizeof(char*));
int linelength = 500; //arbitrary value to assure that lines are read completely
streamVec = fopen(file_in, "r");
if (streamVec == NULL) {
printf("*** ERROR: Could not open file: %s\n", file_in);
return 1;
}
*totalwords = 0;
while (fgets(line, linelength, streamVec) != NULL) { //New line read from the file
if ( ! isContained(line, currentList, *totalwords)){ //check if the word is already in the list
currentList[*totalwords] = malloc(strlen(line) * (sizeof(char)+1));
strcpy(currentList[*totalwords], line);
(*totalwords)++;
}
} //End of the read loop
fclose(streamVec);
for (i = 0; i < *totalwords; i++) {
printf("%i %s\n", i, currentList[i]);
free(currentList[i]);
}
free(currentList);
}
int isContained(char* mystring, char** arrayofstring, int arraylength) {
int i;
for (i = 0; i < arraylength; i++) {
if (strcmp(arrayofstring[i], mystring) == 0) {
return 1;
}
}
return 0;
}
Jawaban
Kode yang Anda posting mengkompilasi, tetapi gagal saat run-time. Debugger memberi anotasi dan menemukan kegagalan pertama ke lokasi ini:
alokasi memori tampaknya menjadi pelakunya.
Berikut adalah beberapa saran, dan tautan ke satu atau dua cuplikan kode yang dapat membantu dengan saran berikut.
Pernyataan masalah :
- Membaca daftar kata dari file (disusun dengan satu kata per baris) ke dalam susunan kata.
- hitung daftar kata-kata berbeda / unik dari larik.
Daftar tugas :
- dapatkan jumlah kata dari file asli.
- dapatkan panjang kata terpanjang dari file aslinya.
- membuat penyimpanan berisi daftar kata dari file asli.
( menggunakan informasi yang dikumpulkan dalam dua langkah sebelumnya .) - membaca kata-kata dari file asli menjadi susunan kata yang lengkap.
- urutkan kata lengkap. (ini opsional.)
- loop melalui larik penuh yang diurutkan untuk menghitung daftar kata yang unik / berbeda menggunakan
isContained()fungsi Anda .
Beberapa posting yang disarankan untuk referensi:
Dapatkan jumlah kata dari file . (Ini dapat diadaptasi untuk mendapatkan kata terpanjang dari file.)
Buat array penyimpanan.
Urutkan larik asli. ( using qsort()) (Sekali lagi, langkah opsional.)
currentList[*totalwords] = malloc(strlen(line) * (sizeof(char)+1));
Baris ini salah. Harus:
currentList[*totalwords] = malloc((strlen(line) + 1) * sizeof(char));
untuk menambahkan byte ekstra untuk penghentian null.