【问题标题】:Formatted input array int格式化输入数组 int
【发布时间】:2018-05-19 06:58:08
【问题描述】:

我需要能够输入ints 的数组并将其保存在struct 内的集合中,但是由于某种原因它不会将数字读入数组:

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

#define MAX 100

typedef struct set {
    int arr[MAX];
} set;

set SETA;

int read_set(set,...);
void print_set(set);

int main(){
    int x;
    x=read_set(SETA,2,3,4,-1);
    printf("%d numbers were read\n",x);

    print_set(SETA);
    return 0;
 }

void print_set(set s){
    int *iptr;
    iptr=s.arr;

    while(*iptr++){
        printf("%d ",*iptr);
    }
}


int read_set(set s,...){
    va_list ap;
    int i=0;
    int c=0;

    va_start(ap,s);

    while( *ap != -1){
        s.arr[i++]=va_arg(ap,int);
        printf("%d was entered\n",s.arr[i]);
        c++;
    }
    va_end(ap);
    return c;
}

我得到的输出是:

0 was entered  
0 was entered  
0 was entered  
3 numbers were read  

不用说 print_set 什么也不打印。

【问题讨论】:

标签: c struct formatted-input


【解决方案1】:

while( *ap != -1){
    s.arr[i++]=va_arg(ap,int);
    printf("%d was entered\n",s.arr[i]);
    c++;
}

在记录值时增加i。 当您尝试打印 s.arr[i] 时,您比存储值的位置领先。

在打印之后增加

while( *ap != -1){
    s.arr[i]=va_arg(ap,int);
    printf("%d was entered\n",s.arr[i]);
    i++;
    c++;
}

int read_set(set s,...) 函数获取 set s 的副本并将内容放入其中。 当你回到 main 中的调用函数时,你复制的 set 没有改变。 您需要发送指向变量的指针来更改它们:

int read_set(set *ps,...)

然后调用代码需要发送地址x = read_set(&amp;SETA, 2, 3, 4, -1);,以便您可以更改集合中的内容。 另一种方法是返回填充的结构。

另外两件事要考虑。 首先,您可以在 main 中声明您的集合 - 它没有理由是全局的。 你不需要captilaise它。

int main() {
    set setA; //style/design point. Also don't shout.
    //... etc
}

另外,看看你的打印功能。 它使用while (*iptr++),因此检查 0 或某种 NULL 以停止循环。我看不到任何零,所以这需要重新考虑。而且,您想要一个不会显示 0 以外任何内容的 set 吗?

【讨论】:

  • 谢谢!任何想法为什么 print_set 不会打印任何东西?
  • @YaroslavMiloslavsky:“为什么 print_set 不会打印任何东西的任何想法”排在第一位,因为它没有被调用,至少不是你显示的代码。跨度>
  • @alk 我添加了它,在我的代码中它确实显示了,下次我会更清楚:)
  • @YaroslavMiloslavsky:如果-1 未被定义为arr 元素的允许值,那么您采用的方法非常好。
  • 因此打印功能 - 或其他任何功能 - 不会有 -1 来显示您已经到达然后结束。您可以将长度/计数与set 一起传递
猜你喜欢
  • 2015-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-02
  • 2019-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多