格式化输入数组 int
Formatted input array int
我需要能够输入 int
的数组并将其保存在 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 什么都不打印。
在
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(&SETA, 2, 3, 4, -1);
以便您可以更改集合中的内容。
另一种方法是 return 填充结构。
还有两件事需要考虑。
首先,您可以在 main 中声明您的集合——它没有理由是全局的。
而且你不需要 captilaise 它。
int main() {
set setA; //style/design point. Also don't shout.
//... etc
}
另外,看看你的打印功能。
它使用 while (*iptr++)
,因此检查 0 或某种 NULL 以停止循环。我看不到任何零,因此需要重新考虑。而且,您想要 set
不显示任何超过 0 的内容吗?
我需要能够输入 int
的数组并将其保存在 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 什么都不打印。
在
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(&SETA, 2, 3, 4, -1);
以便您可以更改集合中的内容。
另一种方法是 return 填充结构。
还有两件事需要考虑。 首先,您可以在 main 中声明您的集合——它没有理由是全局的。 而且你不需要 captilaise 它。
int main() {
set setA; //style/design point. Also don't shout.
//... etc
}
另外,看看你的打印功能。
它使用 while (*iptr++)
,因此检查 0 或某种 NULL 以停止循环。我看不到任何零,因此需要重新考虑。而且,您想要 set
不显示任何超过 0 的内容吗?