C-从用户那里获取字符串,并为其返回一系列指针,所有运行时间



我正在使用一个称为 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指针。

最新更新