【问题标题】:How to work with a variable number of variables in C?如何在 C 中使用可变数量的变量?
【发布时间】:2019-01-19 04:41:26
【问题描述】:

所以我只使用 stdio.h 在 C 中思考这个问题 -

我必须编写一个程序来读取整数p,然后读取p 整数。现在我必须使用这些p 整数并对它们执行另一个操作以获得最终答案,我的主程序将返回。

问题是我不知道如何对可变数量的整数执行操作。我尝试使用指针,但它们似乎不起作用。

有人可以帮忙吗?

#include <stdio.h>

int main(){
    int i, p, n;
        scanf ("%d", &p);
        for (n=0; n<p; n++){
            int a;
            scanf ("%d", &a);
            int *k=&a;
        }
        for (n=0; n<p; n++){
            int a=*k;
            if (a==0)
                i=0;
            else i=1;
        }
    return i;
}

我这里要做的是读取某个整数p,然后读取p整数a,如果这些as中至少有一个是0,我的答案是@987654332 @。否则为1

但是编译器说 *k 没有为第二个 for 循环定义。我该怎么办?

【问题讨论】:

  • 这是一道作业题吗?
  • “我尝试使用指针,但它们似乎不起作用”——你能发布这个尝试吗?见how to ask
  • 向我们展示您的尝试。
  • 不,这不是家庭作业。这不是一个真正的具体问题或任何东西,反正我是物理专业的,而且代码很有趣。
  • 是的,我可以给你看我写的程序,但是给我一些时间。我将不得不重写它,因为我删除了它

标签: c operators stdio


【解决方案1】:

我认为您可以使用固定数量的变量来做到这一点。喜欢

int p, a, ans=1;
scanf("%d", &p); //read number

for(int r=0; r<p; ++r)
{
    scanf("%d", &a);
    if(a==0)
    {
        ans=0;
        break;
    }
}   
printf("\nAnswer is: %d", ans);

ans 变量持有答案。首先您将ints 的数量读入p,然后使用循环读取pints 的数量。

在循环的每次迭代中,您都会读入同一个变量a。您只需要知道是否至少有一个输入为零。

ans 最初设置为1,只有在输入零时才更改为0。如果输入零,由于break 语句,控件立即退出循环。

您可能需要检查scanf() 的返回值和其他错误检查。

cmets 中提到了使用未知数量变量的各种方法。

如果您可以使用 C99,则允许使用 variable length array。喜欢

int p;
scanf("%d", &p);
int arr[p];

如果使用动态内存分配,您可以使用stdlib.h 中的malloc()calloc()

this


还有指针k

    for (n=0; n<p; n++){
        int a;
        scanf ("%d", &a);
        int *k=&a;
    }
    for (n=0; n<p; n++){
        int a=*k;
        if (a==0)
            i=0;
        else i=1;
    }

是第一个循环的局部变量,因此仅对该循环可见,而对第二个循环不可见。 k 的范围仅限于第一个循环。见this

如果您希望变量在两个循环中都可见,请在两个循环之外声明它。

【讨论】:

  • 非常感谢。我不知道有一种东西叫做break。这确实回答了我的问题。
【解决方案2】:

首先,我会帮助你理解你所说的编译器错误:

没有为第二个for循环定义k

// some code

for (n=0; n<p; n++){
    int a;
    scanf ("%d", &a);
    int *k=&a;   // Definition of k is here, and is restricted to this block, 
}
for (n=0; n<p; n++){
    int a=*k;   // Its undefined here
    if (a==0)
       i=0;
    else i=1;
}
// some code

说明:阅读代码中的注释。我所说的块是上'{'和下'}'之间的代码。除此之外,在代码中的任何地方,k 都是未定义的。因此在第二个循环中,k 是未定义的。 您应该将 main() 函数更改为:

int main() 
{
    int i, p, n, k = 0;
    scanf ("%d", &p);
    for (n=0; n<p; n++) {
        int a;
        scanf ("%d", &a);
        int *k=&a;
    }
    for (n=0; n<p; n++) {
        int a=*k;
        if (a==0)
            i=0;
        else 
            i=1;
    }
    return i;
}

现在要解决您的下一个问题,我想您可能想学习 C 语言中的variadic functions。我可能对您的问题陈述的理解有误,但我的看法是您愿意将多个参数传递给函数.例如,

在某个时候,您想调用function 为:

function(Count_args, 1, 2, 3, 4, 5);

有时是:

function(Count_args, 10);

如果我是对的,您可能想看看我上面引用的同一参考资料上的this example。为了让您的生活更轻松,我在这里添加相同的代码:

#include <stdarg.h>
#include <stdio.h>

int
add_em_up (int count,...)
{
    va_list ap;
    int i, sum;

    va_start (ap, count);         /* Initialize the argument list. */

    sum = 0;
    for (i = 0; i < count; i++)
    sum += va_arg (ap, int);    /* Get the next argument value. */

    va_end (ap);                  /* Clean up. */
    return sum;
}

int
main (void)
{
    /* This call prints 16. */
    printf ("%d\n", add_em_up (3, 5, 5, 6));

    /* This call prints 55. */
    printf ("%d\n", add_em_up (10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10));

    return 0;
}

如果您愿意了解最新标准中关于函数具有可变参数的说法,请参阅 C11,7.16 Variable arguments 部分,它确实有帮助!

【讨论】:

  • 谢谢,这确实帮了很多忙。我一定会看看你提到的一切。
猜你喜欢
  • 1970-01-01
  • 2012-04-02
  • 1970-01-01
  • 1970-01-01
  • 2013-05-16
  • 2017-07-12
  • 1970-01-01
  • 1970-01-01
  • 2018-05-09
相关资源
最近更新 更多