【问题标题】:Creating an array of strings using malloc in C在 C 中使用 malloc 创建一个字符串数组
【发布时间】:2016-02-23 21:58:12
【问题描述】:

我完全是 C 新手,刚刚了解了使用 malloc、realloc、calloc 和 free 进行动态内存分配。

我想制作一个小程序,它将一个 int 数作为将要给出的字符串的数量,然后将它们全部“扫描”。 接下来用这些琴弦演奏。例如找到最频繁的并打印出来。
例如,当我运行程序并输入:
5
车房狗树树
它应该打印:
树 2

我想要 scanf-printf 因为这是我目前最熟悉的输入/输出方法。
我的代码:

int main (){

int N,i,j ;

char *array;

int *freq;


 scanf("%d",&N);

 array = (char*)calloc(N,sizeof(char*));
 for (i=0;i<=N;i++){    
  scanf( ??? );  
 }

 free(array);  
 return 0;  
}

我应该在 scanf 函数中输入什么才能正确地用字符串填充数组? 在我填充它之后,我会使用 strcmp 和 for 循环之类的东西来扫描数组并找到最常用的单词吗? (我可以将频率存储在 *freq 中)

【问题讨论】:

    标签: c arrays string malloc calloc


    【解决方案1】:

    您想要分配一个字符串数组,换句话说,一个指向字符的指针数组,而这正是您分配的内容。问题是您将calloc 返回的指针分配给字符的数组。

    您实际上有两个选择:将array 的声明更改为指向字符的“数组”指针,例如char **array,然后也动态分配各个字符串。像这样的

    // Allocate an array of pointers
    char **array = calloc(N, sizeof(*array));
    
    // Allocate and read all strings
    for (size_t i = 0; i < N; ++i)
    {
        // Allocate 50 characters
        array[i] = malloc(50);  // No need for `sizeof(char)`, it's always 1
    
        // Read up to 49 characters (to leave space for the string terminator)
        scanf("%49s", array[i]);
    }
    

    或者您可以将array 的类型更改为指向固定大小的“字符串”的指针,如下所示

    // Define `my_string_type` as an array of 50 characters
    typedef char my_string_type[50];
    
    // Declare a pointer to strings, and allocate it
    my_string_type *array = calloc(N, sizeof(*array));
    
    // Read all strings from the user
    for (size_t i = 0; i < N; ++i)
    {
        // Read up to 49 characters (to leave space for the string terminator)
        scanf("%49s", array[i]);
    }
    

    注意我don't cast the result of calloc or malloc。你不应该在 C 中转换 void *

    【讨论】:

    • 现在是有趣的部分:对于频率问题(出现次数最多的字符串)我应该实现这样的东西:for (i=0;i
    • @ManosG 类似的东西可能会起作用,但要注意内部循环的条件。
    【解决方案2】:

    在scanf函数中,你需要选择一个格式和你想要数据去的数组。例如:

    scanf("%[^\n]", array); 
    

    【讨论】:

      【解决方案3】:

      你需要确保输入不超过你应用的大小,试试scanf("%s",array);

      【讨论】:

      • 我刚刚注意到您似乎只是制作了一个一维数组,但您想在其中存储字符串?您需要制作一个 char** 来制作它。或者它只是一个字符串,在一些字符之间而不是单词之间有空格。
      猜你喜欢
      • 1970-01-01
      • 2017-03-29
      • 2014-08-26
      • 1970-01-01
      • 2011-08-21
      • 1970-01-01
      • 1970-01-01
      • 2020-05-26
      • 1970-01-01
      相关资源
      最近更新 更多