我想打印所有输入的元素。相反,我的代码打印最近输入的元素两次。
这是我的代码:
#include<stdio.h>
void f(struct ar *a);
void d(struct ar *a);
struct ar
{
char name[50];
};
int main()
{
struct ar a;
f(&a);
d(&a);
}
void f(struct ar *a)
{
int i;
for(i=0;i<2;i++)
{
printf("enter name:");
gets(a->name);
}
}
void d(struct ar *a)
{
int i;
for(i=0;i<2;i++)
{
puts(a->name);
}
}
例如:
输入
name:john
name:kendall
输出
kendall
kendall
答案 0 :(得分:3)
这是因为你在每次迭代中都覆盖了这个值。
您可以在main()
中创建一个数组并将数组传递给函数,以便将值存储在不同的位置,而不是总是将相同的结构实例传递给gets()
,从而覆盖之前的值,因此打印循环打印相同数据两次。
以下演示如何传递数组
#include <stdio.h>
struct Data
{
char name[50];
};
void readData(struct Data *array);
void showData(struct Data *array);
int main()
{
struct Data array[2];
readData(array);
showData(array);
}
void readData(struct Data *array)
{
int i;
for (i = 0 ; i < 2 ; i++)
{
printf("enter name: ");
fgets(array[i].name, sizeof(array[i].name), stdin);
}
}
void showData(struct Data *array)
{
int i;
for (i = 0 ; i < 2 ; i++)
{
printf("%s", array[i].name);
}
}
此外,在命名标识符方面不要太懒,即使是简单的演示,它们也有助于使程序意图清晰,并且如果您认为无关紧要,它们可以帮助您永久保持它,那么当你从事现实生活中的项目时,我担心你会遇到很多问题。
答案 1 :(得分:0)
在这里,您将在同一变量中输入两次输入。所以发生了什么:
ar->name
中。第一个输入是john
,因此ar->name="john"
ar->name
中。因此,如果您输入的是kendall
,那么ar->name="kenadall"
。因此john
值会被kendall
覆盖,当您打印时,您获得kendall
值。
答案 2 :(得分:0)
有Linked List
做同样的事情:
#include <stdio.h>
#include <stdlib.h>
struct Data
{
char name[50];
struct Data *next;
};
struct Data *readData();
void showData(struct Data *array);
int main()
{
struct Data *array;
array = readData();
showData(array);
}
struct Data *readData()
{
int i;
struct Data *tmp = NULL;
struct Data *head = NULL;
struct Data *end = head;
for (i = 0 ; i < 2 ; i++)
{
tmp = (struct Data *)malloc(sizeof(struct Data));
printf("enter name: ");
fgets(tmp->name, sizeof(tmp->name), stdin);
if (head == NULL) {
head = tmp;
} else {
end->next = tmp;
}
end = tmp;
}
return head;
}
void showData(struct Data *array)
{
int i;
struct Data *a = array;
while(a != NULL) {
printf("%s\n", a->name);
a = a->next;
}
}
答案 3 :(得分:0)
在第
行gets(a->name);
每次for循环运行时,您都将用户输入记录到同一位置。相反,尝试像
这样的东西#include<stdio.h>
struct Name
{
char first[50];
char last[50];
};
void recordName(struct Name *name); //writes Name structs
void reportName(struct Name *name); //prints contents of Name structs
int main()
{
struct Name test_Name;
recordName(&test_Name);
reportName(&test_Name);
return 0;
}
void recordName(struct Name *name)
{
printf("enter first Name: ");
fgets(name->first,sizeof(name->first),stdin);
printf("enter last Name: ");
fgets(name->last,sizeof(name->last),stdin);
}
void reportName(struct Name *name)
{
printf("%s%s",name->first, name->last);
}