Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C编程-递归填充数组_C - Fatal编程技术网

C编程-递归填充数组

C编程-递归填充数组,c,C,我正在尝试创建一个代码,这样它将要求用户键入数组的大小,以填充0-1000之间的随机数 我的尝试: #include <stdio.h> int main() { int p = 0; int s; int aRRay[1001]; printf("\n Enter size of an array to fill random numbers: "); scanf("%i",s); printf("%i",fillArray(aRR

我正在尝试创建一个代码,这样它将要求用户键入数组的大小,以填充0-1000之间的随机数

我的尝试:

#include <stdio.h>

int main()
{
    int p = 0;
    int s;
    int aRRay[1001];
    printf("\n Enter size of an array to fill random numbers: ");
    scanf("%i",s);
    printf("%i",fillArray(aRRay,p,s));

}
int fillArray(int aRRay[],int p, int s) 
{
    srand((unsigned)time(NULL));
    int ran = rand()%1001;
    aRRay[p] = ran;
    if(p>s)
    {
        return 0;
    }

    else
    {
       return fillArray(aRRay,++p,s);
    }
}
#包括
int main()
{
int p=0;
int-s;
int数组[1001];
printf(“\n输入填充随机数的数组大小:”);
scanf(“%i”,s);
printf(“%i”,fillArray(aRRay,p,s));
}
int fillArray(int数组[],int p,int s)
{
srand((无符号)时间(NULL));
int ran=rand()%1001;
数组[p]=ran;
如果(p>s)
{
返回0;
}
其他的
{
返回fillArray(数组,+p,s);
}
}
此代码崩溃。我不确定是否将最后一条printf语句放在了main中的错误位置。我可以把它放在函数fillArray中,而不是放在main中,然后使用递归逐个打印出来吗?

(免责声明:以下文章试图解决所发布代码的直接错误和问题,可能还有其他与错误检查相关的问题和编码风格问题需要解决,但这些问题暂时不在本文讨论范围内,以便集中讨论主要问题)

  • 您应该传递变量的地址:

    scanf("%i", &s);
    
    另外,您应该确保读取成功

  • 首先填充数组,然后检查条件(不计算零索引),当用户要求2时,实际上是在向数组中写入4个元素,将代码更改为类似以下内容:

     int fillArray(int aRRay[], int p, int s)
     {
         if (p >= s)
         {
            return 0;
         }
         else
         {
            srand((unsigned)time(NULL));
            int ran = rand() % 1001;
            aRRay[p] = ran;
    
            return fillArray(aRRay, ++p, s);
         }
     }
    

  • 此代码中有几处明显错误,其中许多错误会产生您应该已经解决的警告:

    一般而言:

    • srand()
    • time()
      是在
      time.h
      中定义的,您没有将其包括在内
    • 您没有将
      int
      地址作为输出目标传递给
      scanf
    • 您没有检查
      scanf
      调用的结果
    • 您处理的是数量级,它应该是无符号类型。即使您修复了上述项,也有人可以输入
      -5
      ,您的代码将乐于解析它并进入未定义的行为
    • 如果
      stdout
      是行缓冲的,则在没有刷新的情况下,您的输入提示将不可见
    • 如果要对数组大小使用硬限制(
      1001
      ),则应在有效读取数组的输入大小后强制执行该值
    • fillArray
      在首次在
      main()
      中使用之前没有正式的原型。因此,假设函数接受任意数量的参数并返回
      int
    在生成函数中:

    • 你是说,纾困逻辑做得太晚了,而且条件不对
    • 您不应该在fill函数中调用
      srand()
      。它应该在进程启动时从
      main()
      调用一次
    • 次要:您不需要同时传递当前输入槽和长度。您正在填充所有槽,因此基于值的降序槽或通过指针算法增加目标指针就足够了
    下面将介绍其中的大部分内容。我不明白你为什么要用递归来做这件事,但我怀疑这是为了学术界。如果是这样,你的导师可以提出更好的递归算法课程。但现在,你需要更多地学习基础知识。上面的项目清单表明你需要在这些方面做大量工作

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    int fillArray(int arr[], unsigned int s);
    
    int main()
    {
        unsigned int s = 0;
        int arr[1001];
    
        srand((unsigned)time(NULL));
    
        printf("Enter size of an array to fill random numbers: ");
        fflush(stdout);
    
        if (scanf("%u",&s) == 1 && s < sizeof(arr)/sizeof(*arr))
            printf("%d\n", fillArray(arr,s));
    
    }
    
    int fillArray(int arr[], unsigned int s)
    {
        if (s)
        {
            *arr = rand() % 1001;
            return fillArray(arr+1, --s);
        }
        return 0;
    }
    
    #包括
    #包括
    #包括
    int fillArray(int arr[],无符号int s);
    int main()
    {
    无符号整数s=0;
    int arr[1001];
    srand((无符号)时间(NULL));
    printf(“输入数组大小以填充随机数:”);
    fflush(stdout);
    如果(扫描频率(“%u”、&s)==1&s
    scanf(“%i”和&s)可能是一个好的开始首先,为什么要递归?迭代有什么问题?其次,
    srand(time)
    将使以下
    rand()
    几乎每次返回相同的值(
    time
    的分辨率为1秒)。最后,
    fillArray
    是否总是返回0?请阅读的文档。注意,它可能会失败。您应该使用并测试
    scanf
    的结果(扫描项目计数)。我更关注“错误修复”而是关于完整的错误处理,但我会提到这一点,因为它是正确的2000@pm100
    s
    不是偶然出现的,这是项目符号的强制执行:“如果要对数组大小使用硬限制(在您的情况下为1001)有效读取数组的输入大小后,应强制执行该值“+1表示全面性。挑剔:
    --s
    应该是
    s-1
    。结果是一样的,但第一个是不好的风格,当你不需要修改变量时。它也会与
    arr+1
    一致。很抱歉,我的意思是原始海报没有处理这个问题,你也没有在你很好的时候把它说出来list@pm100它是/是ca在列表中填写(见“概述”部分倒数第二项)。虽然事后诸葛亮是这样的,但应该是
    s