首页 > 解决方案 > 提供一系列数字 (C) 的函数存在问题。为什么?

问题描述

我创建了一个函数,它根据一个数字提供一系列数字,以及您想要获得的数字数量与该数字不同(我知道,这种解释有点含糊,所以这里有一个例子):

Number of origin: 10
Number of numbers to count away from the origin: 5
Output:
[5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

所以这里是代码:

#include <stdio.h>
#include <stdlib.h>

void plusMinus(int*change, int num, int funcTo){

    int range = funcTo * 2;
    int start = num - funcTo;
    int i;
    for (i=0; i<=range; i++){
        change[i] = start + i;
    }
}

int main()
{
    int* pointer;
    plusMinus(&pointer, 250, 5);
    int x;
    for (x=0; x<=10; x++){
        printf("%d\n", &pointer[x]);
    }
    return 0;
}

这是所需的输出:

245
246
247
248
249
250
251
252
253
254
255

这是当前的输出:

245
249
253
257
261
265
269
273
277
281
285

该代码还返回两个警告,但我不知道它们的含义。这是第一个:

warning: passing argument 1 of 'plusMinus' from incompatible pointer type [-Wincompatible-pointer-types]

这是第二个:

warning: format '%d' expects argument of type 'int', but argument 2 has type 'int *' [-Wformat=]

标签: calgorithm

解决方案


第一个函数参数具有类型int *

void plusMinus(int*change, int num, int funcTo){

但是你传递了一个类型的参数int **

int* pointer;
plusMinus(&pointer, 250, 5);

此外,指针pointer未初始化并且具有不确定的值。结果,程序具有未定义的行为。

在这次呼吁中printf

printf("%d\n", &pointer[x]);

当您传递type 的对象时,转换说明符%d需要一个 type的对象。intint *

这是您更新的程序

#include <stdio.h>

void plusMinus( int *a, int num, int funcTo )
{
    int range = 2 * funcTo + 1;
    int start = num - funcTo;

    for ( int i = 0; i <range; i++ )
    {
        a[i] = start + i;
    }
}

int main(void) 
{
    int funcTo = 5;
    int a[2 * funcTo + 1];

    plusMinus( a, 250, funcTo );

    for ( int i = 0; i  < 2 * funcTo + 1; i++ )
    {
        printf( "%d ",  a[i] );
    }
    putchar( '\n' );

    return 0;
}

它的输出是

245 246 247 248 249 250 251 252 253 254 255 

把函数写成递归函数更有趣。

这个给你。

#include <stdio.h>

void plusMinus( int *a, int num, int funcTo )
{
    a[0] = num - funcTo;

    if ( funcTo ) 
    {
        plusMinus( a + 1, num, funcTo - 1 );

        a[2 * funcTo] = num + funcTo;
    }
}

int main(void) 
{
    int funcTo = 5;
    int a[2 * funcTo + 1];

    plusMinus( a, 250, funcTo );

    for ( int i = 0; i  < 2 * funcTo + 1; i++ )
    {
        printf( "%d ",  a[i] );
    }
    putchar( '\n' );

    return 0;
}

程序输出与上图相同。

245 246 247 248 249 250 251 252 253 254 255 

推荐阅读