我需要写一个函数,输入数组的大小和分配内存,并读取(scanf)值到这个数组。
我写了这个函数,但是它不工作:
void getss(int array[], int size)
{
int counter = 0;
if (size == 0)
return;
if (counter < size) {
scanf("%d", &array[i]);
counter++;
}
getss(array, size - 1);
}
不太清楚你想要达到什么目的。但是我猜你的数组参数在递归调用中是不正确的。现在所有对getss的调用都得到相同的数组,但大小不同。变量i是从哪里来的?变量计数器在张贴代码中没有多大用处。)
我假设你需要在递归调用中更新数组指针以指向数组中的下一个元素。换句话说,传递数组中第二个元素的地址,而不是第一个元素的地址(当前行为)。这将与递归调用中的size-1一致。
实现是微不足道的,但作为一个练习留给海报,因为这看起来像我的家庭作业。
有不需要的变量。这是你想要完成的吗?
下面的代码将填充数组,以便scanf()读取的第一个值将存储在最后一个元素中。
void getss(int array[], int size)
{
if (size == 0)
return;
scanf("%d", &array[size-1]);
getss(array, size - 1);
return;
}
下面的代码将填充数组,以便scanf()读取的第一个值将存储在第一个元素中。
void getss(int array[], int size)
{
if (size == 0)
return;
scanf("%d", &array[0]);
getss(&array[1], size - 1);
return;
}
如果你要迭代地做这件事,你会怎么做?我会假设如下:
void getss(int array[], int size) {
int i;
for (i = 0; i < size; i++) {
scanf("%d", array[i]);
}
}
这里的i
只是用来计数数组,所以如果我们稍微改变一下函数,我们可以去掉它:
void getss(int* array, int size) {
for (; size > 0; size--, array++) {
scanf("%d", array);
}
}
现在我们的"计数器"是size变量本身,而不是在数组中索引,我们只是不断向前移动指针指向它。
现在这是一个完美的形式,可以转化为递归函数。代替size--
和array++
,我们可以在函数末尾将新值传递给对getss
的另一个调用:
void getss(int* array, int size) {
if (size > 0) {
scanf("%d", array);
getss(array + 1, size - 1);
}
}
所以我们的循环终止条件已经转移到if
,而不是array++
和size--
,我们将array+1
和size-1
传递给下一个调用。它实现与循环相同的结果,但没有显式的循环结构。
与其他问题一起,使用counter
的意义是什么?它要么为0,要么为1,并且永远不会传递给下一次调用。它应该被声明为静态的吗?
#include <stdio.h>
#include <stdlib.h>
void getss(int* array, int size){
if (size == 0)
return;
scanf("%d", array);
getss(++array, size - 1);
}
int main(){
int *array;
int i, size;
printf("input array size:");
scanf("%d", &size);
array = (int*)malloc(sizeof(int)*size);
getss(array, size);
for(i=0;i<size;i++){
printf("array[%d]=%dn", i, array[i]);
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int a[100];
void input(int n)
{
if(n==0)
{
return;
}
input(--n);
cin>>a[n];
}
int main()
{
int n=4;
input(n);
for(int i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
}
void getss(int array[], int size , int counter)
{
if (size == 0)
return;
if (counter < size) {
scanf("%d", &array[i]);
counter++;
}
getss(array, size - 1, counter);
}