我需要创建一个未知大小的int数组并将它们全部传递。我的代码如下所示:
int FillTable(int a[], int max){
int i;
int x = 0;
int m = 0;
for (i = 0; i < max; i++){
printf("Fill the table with integers: ");
scanf("%d", &m);
if (m != "" && m != NULL){
a[i] = m;
}else if (m != "" && m == NULL){
a[i] = 0;
}else{
break;
}
}
printf("\n");
return 0;
}
我知道你可以传递多个以空格分隔的整数:
scanf("%d %d %d", &var1, &var2, &var3);
但我不知道如何通过一些我不知道会有多少整数的整数。我可以用一堆%d创建一个字符串,然后只重复 max 次吗?我不知道,但是现在,我只是要求整数,直到数组已满,如果用户没有&#39,我需要能够使数组小于 max ;输入足够的值。有没有人对我如何扫描未知数量的整数有任何想法?
答案 0 :(得分:2)
有没有人对如何扫描未知数量的整数有任何想法?
这需要动态内存分配!
扫描未知整数的一种方法是,首先分配一个大小的整数数组来保存max
个整数。
如何知道用户是否已结束输入?
示例: (考虑用户仅输入正数)
//creating a large enough array to store user inputs
int *array = malloc(sizeof(int) * max);
//check if memory was allocated or not
if(array == NULL)
{
printf("memory allocation problem!");
exit(1);
}
//integer to make note of size of array or you can use the sizeof() function instead
int size_of_array = 0;
for (i = 0; i < max; i++)
{
printf("Fill the table with integers: ");
if(scanf("%d", &m) != 1) //check for scanf return value
{
printf("wrong input, try again");
char consume; //to consume the character
scanf("%c", &consume);
i--;
continue;
}
if (m > 0) //if positive number, accept
{
array[i] = m;
size_of_array++;
}
else //else break out of scanning
{
break;
}
}
//do the program.....
//don't for get to free the memory at the end
free(array);
这是一个有效的例子:https://ideone.com/BHN4sk
答案 1 :(得分:1)
你正在尝试做一些不必要的事情。要预测数组的大小并重新分配合适的确切大小,计算成本会更高(就cpu时间而言),因此保存已分配的内存的好处是不够的。
c中数组的大小存储在某个不一定与数组本身有关的地方。所以你只需要知道程序中有多少数组元素是有趣的,而不是别的。
你可以拥有像
这样的东西struct Array {
int *data;
size_t size;
size_t count;
};
其中size
是数组的总大小,count
是数组中元素的数量,data
是元素。我经常使用这种模式并且它非常有用,特别是如果与realloc()
结合使用,因为它可以节省太多次重复分配内存的费用,而这种代价比使用实际需要的内存要多得多。
但是今天的系统拥有的内存比可以使用的内存多(除非您使用Android Studio,它可以使用与您的计算机一样多的内存)。
答案 2 :(得分:1)
首先,m != "" && m != NULL
可能不会按照您的想法执行。你可能来自另一种语言。我认为该语句的作用是将整数变量m
中的值与字符串文字""
的地址进行比较,然后将其与NULL(计算结果为0)进行比较。
其次,scanf
默认读取,直到空格或换行符。
scanf
在失败时返回负数,因此您的代码应如下所示:
for (i = 0; i < max; i++){
printf("Fill the table with integers: ");
if(scanf("%d", &m) > 0) {
a[i] = m;
}
else {
break;
}
}
我遗漏了a [i] = 0分支,因为我不明白你想要的东西。
此外,您永远不会使用变量x
- 除非您遗漏了更多代码。
答案 3 :(得分:0)
你的问题对我来说并不理解,不过我认为这对你有帮助
int arraySize = 200; // Or whatever
int *array_ = malloc(arraySize * sizeof(int));
使用它并传递* array_作为参数,首先定义数组大小或获取数组大小作为用户输入,并运行for循环直到数组大小
答案 4 :(得分:0)
您应该决定用户如何停止输入(并在提示中包含此信息)。一种快速而肮脏的方式是输入任何不是数字的东西&#34;。我选择这种终止输入的方式,因为它易于实现(因此,快速和脏):
then()
注意:
printf("Fill the table with integers; terminate with 'x':\n");
for (i = 0; i < max; i++)
{
int result = scanf("%d", &a[i]);
if (result != 1)
break;
}
函数将数字直接放入数组中,而不使用任何中间变量scanf
函数返回它读取的数字,通常为1;如果它不是1,那么用户输入 x 或其他任何东西scanf
保存迭代次数,显示从用户读取的数量。您的输入函数应返回数组的大小:
i
您可能还想清除return i; // instead of "return 0"
缓冲区 - 丢弃用户为终止阵列而输入的任何内容:
stdin