使用C语言中的malloc创建字符串数组

时间:2015-11-21 12:12:58

标签: c arrays string malloc calloc

我完全是C的新手,刚刚学习了使用malloc,realloc,calloc和free的动态内存分配。

我想创建一个小程序,它将一个int数作为将给出的字符串数,然后“scanf”它们全部。 接下来玩这些字符串。例如,找到最频繁的并打印出来 例如,当我运行程序并键入:
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中)

3 个答案:

答案 0 :(得分:3)

你想要分配一个字符串数组,换句话说是一个指向字符的指针数组,这正是你所分配的。问题是您将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 *

答案 1 :(得分:1)

在scanf函数中,您需要选择希望数据输出的格式和数组。例如:

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

答案 2 :(得分:1)

您需要确保输入的数量不超过您应用的尺寸,请尝试scanf("%s",array);