我正在使用一个称为 get_string()
的函数,该函数将指针返回到字符串以从键盘获取输入。在程序结束时,char **arr
应将使用键盘输入的字符串固定一系列指针。char *tmp_arr_ptr
用作案例内存分配的临时指针失败(不要丢失所有数据)。
在第1位,我为ARR分配了1个字符尺寸的空间。之后,在for循环中,tmp_str_ptr
从函数中获取字符串的指针。如果此字符串中没有字符,则循环将从中拆开。如果字符串不是空的,则在最后一个单元格之前获得tmp_str_ptr
的地址。重复该过程,直到输入一个空字符串,然后在ARR中的最后一个空间中插入一个空字符(这是为了将ARR作为指针传递而没有其中的元素,因此该功能将知道何时停止寻找其他指针)。
该代码最多可用于两个字符串,不仅仅是我开始遇到错误。另外,我也会在arr=tmp_arr_ptr;
上发出警告,说明来自不兼容的指针类型的分配[默认启用],并且也想解决。
这是我的代码的最新更新版本,其已修复,反映了这里用户的评论:
char **arr;
char **tmp_arr_ptr;
char *tmp_str_ptr;
int i;
int main()
{
if((arr=malloc(sizeof(*arr)))==NULL)
{
printf("Error allocating memory, Exiting.n");
printf("malloc for arr");
return 1;
}
for(i=0;;i++)
{
printf("Enter stringn");
printf("-->");
tmp_str_ptr=get_string();
if(*tmp_str_ptr=='n')
break;
tmp_arr_ptr=realloc(arr,(i+2)*sizeof(**arr));
if(tmp_arr_ptr!=NULL)
{
arr=tmp_arr_ptr;
arr[i]=tmp_str_ptr;
arr[i+1]=NULL;
}
else
{
free(arr);
printf("Error allocating memory, Exiting.n");
printf("realloc for tmp_arr_ptr");
return 1;
}
}
printf("The most common character among the strings is %c",char_with_most_appearances(arr));
for(i=0;;i++)
{
if(arr[i]!=NULL)
free(arr[i]);
else
{
free(arr);
break;
}
}
free(tmp_str_ptr);
return 0;
}
因此,在运行调试器后,Char_with_mast_appearances似乎会导致分割错误。这是功能:
char char_with_most_appearances(char **str_arr_ptr)
{
int i=0,j,most=0,loc=0;
int count_array[128]={0};
while((str_arr_ptr[i]!=NULL)
{
for(j=0;j<strlen(str_arr_ptr[i]);j++)
count_array[(int)str_arr_ptr[i][j]]++;
i++;
}
for(i=0;i<128;i++)
{
if(count_array[i]>most)
{
most=count_array[i];
loc=i;
}
}
return (char)loc;
}
在第1位,它检查指针是否不是null(指针数组中的最后一个元素),接下来它将通过数组并计算每个字符出现多少次,并将该信息保存在一个名为Count_array的数组中。它具有128个单元格,例如ASCII,CHAR ASCII值用作阵列的索引。例如,找到字符" a",然后count_array [97]获取 1。扫描了所有字符串后,搜索了数组中的最大元素,并带有铸件将其位置返回给Char,该炭实际上返回其ASCII char。
首先没有注意到您的Realloc。您需要首先将TMP_ARR_PTR分配给ARR,然后才能在其他空间中写入:
tmp_arr_ptr=realloc(arr,(i+1)*sizeof(*arr));
if(tmp_arr_ptr!=NULL)
arr=tmp_arr_ptr;
arr[i]=tmp_str_ptr;
您从未分配给最终NULL
指针。