从用户获取字符串并为它们返回指针数组,所有运行时

时间:2014-03-07 01:19:06

标签: c arrays string pointers malloc

我正在使用一个名为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字符。

2 个答案:

答案 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指针。