结构体字符串数组打印最后输入的元素。

4
我想打印出所有输入的元素,但我的代码会把最近输入的元素打印两次。
以下是我的代码:
#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

3
你永远不应该使用 gets() 函数,而应该使用 fgets() 函数代替。这是 gcc 给出的警告:“gets 函数很危险,不应该使用。” - Iharob Al Asimi
你需要创建一个链表。链式数据结构 - chengpohi
3
在你的循环中,你两次获取/打印了a->name,但没有将其移动到其他地方。那么你期望得到什么? - Eugene Sh.
1
@chengpohi 我不这么认为。 - Iharob Al Asimi
4个回答

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);
     }
 }

此外,在命名标识符时不要懒惰,即使是简单的演示,它们也有助于清晰表达程序意图并帮助您永久地维护它。如果您认为这不重要,那么当您在实际项目中工作时会遇到很多问题。


谢谢您的回答,我会考虑您的建议。 - eisenheim

0

在这里,您正在使用同一变量两次输入。所以发生的情况是:

  • 在第一次迭代中,输入被存储在ar->name中。第一个输入是john,所以ar->name="john"
  • 在下一次迭代中,输入也被存储在ar->name中。所以如果您的输入是kendall,那么ar->name="kenadall"

因此,john值被kendall覆盖,当您打印时,您会得到kendall值。


0

有一个 链表 可以完成同样的事情:

#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;
    }
}

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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接