我完全是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中)
答案 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);