我试图在双字符指针中增加一行内存,但由于某种原因程序崩溃,即使我没有收到任何警告。我用谷歌搜索,人们继续提供这种方式来重新分配,但它并不适合我。你知道捕获的地方吗?它在最后一行。
提前致谢!
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define E 255
void Palindromas(char* Zodis, char eilute[E], int *kiekis, char** Ats);
int main()
{
char Eilute [E];
int i, kiekis = -1;
char** Ats;
char* Zodis;
Zodis = malloc(E * sizeof(char));
Ats = malloc(1 * sizeof(char*));
// Failu aprasymas
FILE *Duomenys = fopen("Duomenys.txt", "r");
FILE *Rezultatai = fopen("Rezultatai.txt","w");
//--------------------------------
if (Ats == NULL)
{
printf("Atmintis nebuvo paskirta");
exit(0);
}
if (Zodis == NULL)
{
printf("Atmintis nebuvo paskirta");
exit(0);
}
if (Duomenys == NULL) printf("Nurodyto duomenu failo nera \n");
while(fgets(Eilute, sizeof(Eilute), Duomenys))
{
Palindromas(Zodis, Eilute, &kiekis, Ats);
}
for (i = 0; i <= kiekis; i++)
{
fprintf(Rezultatai, "%s ", Ats[i]);
}
free(Ats);
free(Zodis);
fclose(Duomenys);
fclose(Rezultatai);
return 0;
}
void Palindromas(char* Zodis, char Eilute[E], int *kiekis, char** Ats)
{
int i, l, j, index, ilgis, eil;
for(i = 0; 1 == sscanf(Eilute + i, "%s%n", Zodis, &l); i = i + l)
{
*kiekis = *kiekis + 1;
index = 1;
ilgis = strlen(Zodis);
Ats[*kiekis] = malloc(ilgis * sizeof(char));
for (j = 0; j < ilgis; j++)
{
if (Zodis[j] != Zodis[ilgis - j - 1])
index = 0;
}
if (index == 1) strcpy(Ats[*kiekis], Zodis);
eil = *kiekis + 2;
Ats = realloc(Ats, eil * sizeof(char*));
}
}
答案 0 :(得分:0)
我必须使用谷歌来理解你的代码,也许下次你可以为我们翻译它。
我有一些意见:
if (Duomenys == NULL)
只是打印错误信息,但不会停止执行。它应该像以前的验证一样(如果返回错误代码则更好)。Ats[*kiekis] = malloc(ilgis * sizeof(char));
错误,它应该是Ats[*kiekis] = malloc((ilgis+1) * sizeof(char));
,因为它需要空间来结束空字符。if (Zodis[j] != Zodis[ilgis - j - 1]) index = 0;
很好,但更好的是if (Zodis[j] != Zodis[ilgis - j - 1]) { index = 0; break; }
,因为这样循环将停在第一个不同的字符处。if (index == 1) strcpy(Ats[*kiekis], Zodis);
必须为if (index == 1) strcpy(Ats[*kiekis], Zodis);else --*kiekis
,否则您的Ats
数组也不会包含回文词。Ats
数组的每个元素,然后使用类似for(i=0; i<=kiekis; i++) free(Ats[i]);
最后,回答你的问题,重新分配Ats
数组就是这样做:
Ats = realloc(Ats, (*kiekis+1) * sizeof(char*));
我会像这样重新组织你的功能:
void Palindromas(char* Zodis, char Eilute[E], int *kiekis, char** Ats)
{
int i, l, j, index, ilgis;
for(i = 0; 1 == sscanf(Eilute + i, "%s%n", Zodis, &l); i = i + l)
{
index = 1;
ilgis = strlen(Zodis);
for (j = 0; j < ilgis; j++)
{
if (Zodis[j] != Zodis[ilgis - j - 1])
{
index = 0;
break;
}
}
if (index == 1)
{
++*kiekis;
Ats = (char **)realloc(Ats, (*kiekis+1) * sizeof(char*));
Ats[*kiekis] = dup(Zodis); // dup == malloc+strcopy
}
}
}