我正在使用一个名为get_string()
的函数,它返回一个指向字符串的指针以从键盘输入。在程序结束时char **arr
应该包含一个指向使用键盘输入的字符串的指针数组。 char *tmp_arr_ptr
用作案例内存分配失败的临时指针(不丢失所有数据)。
在第1天,我为arr分配1个字符大小的空间。在for循环之后,tmp_str_ptr
获取指向函数中字符串的指针。如果此字符串中没有字符,则循环将从中分离出来。如果字符串不为空,则最后一个单元格之前的当前字符串将获取tmp_str_ptr
的地址。重复该过程,直到输入一个空字符串,然后在arr的最后一个空格处插入一个NULL(这是为了将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 string\n");
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_most_appearance会导致分段错误。 这是功能:
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;
}
在1st,它检查指针是否为NULL(指针数组中的最后一个元素),然后它将通过数组并计算每个字符出现的次数,并将该信息保存在名为count_array的数组中。它有128个单元格,如ASCII,char ASCII值用作数组的索引。例如,找到字符'a',然后count_array [97]得到+1。在扫描完所有字符串之后,搜索数组中最大的元素,并返回它的位置,并转换为char,实际上返回它的ASCII字符。
答案 0 :(得分:0)
起初没有注意到你的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;
答案 1 :(得分:0)
您从未分配过最终的NULL
指针。