如何从c中的函数返回多个值

时间:2014-03-27 15:04:50

标签: c function

我认为说这个主题是什么并不重要。我只想提一下,我想打印ia以及1

这是我的代码:

int riz(int k,int *p,int *q)
{
    int i;
    int a;

    for (i = 1; i <= sqrt((double)k) + 1; i++)
    {
        for (a = 1 ; a <= sqrt((double)k) + 1; a++)
        {
            if (a*a+i*i == k)
            {
                p=&a;
                *p=a;
                q=&i;
                *q=i;

                return 1;
            }
        }
    }

    return 0;
}

int main(int argc, char *argv[])
{
    int p;
    int q;
    int a;

    printf("Give me a number or type 0 to exit \n");
    scanf("%d", &a);
    if (a == 0)
        return 0;
    printf("%d\n", riz(a, &p, &q));

    while (a != 0)
    {
        printf("Give me a number or type 0 to exit \n");
        scanf("%d", &a);
        if (a == 0)
            return 0;
        printf("%d\n", riz(a, &p, &q));
    }

    return 0;
}

我已经阅读了与此相关的其他问题,但我仍然无法弄清楚为什么我无法打印ia

4 个答案:

答案 0 :(得分:2)

问题在于:

    if (a*a+i*i==k){
        p=&a;  // p now points to a in riz instead of a in main
        *p=a;  // This is equivalent to a=a
        q=&i;  // q now points to i in riz instead of i in main
        *q=i;  // This is equivalent to i=i

更改为:

    if (a*a+i*i==k){
        *p=a;  // This will write the value of a in riz to a in main
        *q=i;  // This will write the value of i in riz to i in main

答案 1 :(得分:0)

如果要从函数返回多个值,可以通过传递给函数的参数返回它们。

修改

并且您应该将值存储在*p中,而不是将p指向a的地址。

Here是一些解释。

答案 2 :(得分:0)

你正在改变什么&#39; p&#39;是指&#39; a&#39; (p =&amp; a)和&#39; a&#39;在函数结束时超出范围。如果你只是使* p = a那么那将保持p指向的值为&#39; a&#39;。

同样适用于您的其他变量&#39; q&#39;所以你的代码最终会以

结束
if (a*a+i*i==k){
        *p=a;
        *q=i;
}

这是因为您正在使函数中传递的指针指向“riz”的本地变量。方法,所以当方法&#39; riz&#39;终止变量a和i超出范围,对你的主要意义不重要。因此,上面的代码设置了&#39; p&#39;指出&#39; a&#39;这是我认为你想要的。

答案 3 :(得分:0)

在调用站点,您需要将指针传递给您希望放置返回值的变量,您正在执行此操作:

int main(int argc, char *argv[]) {
    int p;
    int q;

    ...

    riz(a,&p,&q)
到目前为止,这么好;但是,在函数中,您只需将要返回的值分配给指针已指向的位置。你不想改变指针;调用者已经将它们设置为应该指向的位置。这是错的:

        p=&a;
        *p=a;
        q=&i;
        *q=i;

应该只是:

        *p=a;
        *q=i;

最后,如果要在函数返回后打印值,则必须调用该函数,然后打印值。之一:

    printf("%d", riz(a,&p,&q));
    printf(" %d %d\n", p, q);

或者,如果您想通过一次调用printf来执行此操作:

    int r;
    r = riz(a,&p,&q);
    printf("%d %d %d\n", r, p, q);

NOT 执行:

    printf("%d %d %d\n", riz(a,&p,&q), p, q);

因为C不保证评估参数的顺序,所以在调用 p之前,qriz可能是它们的值。< / p>

但请注意,当riz返回0时,pq 已更新,因此其值将为垃圾(我们盲目打印)。如果这确实是您希望它的工作方式,您可能需要检查返回值以确定是否要对pq执行任何操作。

在一个不相关的说明中,main中存在一个主要的代码复制问题(几乎一半的代码被复制,这意味着你必须完成两次修复bug的工作)。为什么不这样做:

int main(int argc, char *argv[])
{
    int p;
    int q;
    int a;

    for(;;) {
        printf("Give me a number or type 0 to exit \n");
        scanf("%d", &a);
        if (a == 0)
            break;
        printf("%d\n", riz(a, &p, &q));
    }

    return 0;
}