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

时间:2015-05-25 14:55:42

标签: c arrays struct

我想打印所有输入的元素。相反,我的代码打印最近输入的元素两次。

这是我的代码:

#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

4 个答案:

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