微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

打印整个结构 C 信息的最有效方法?

如何解决打印整个结构 C 信息的最有效方法?

我想知道是否有更有效的方式(更少的行,更少的内存)来打印字符串中包含的信息。我在循环思考功能参数。例如,如果您需要打印 100 名学生的信息(姓名、组和生日),我想有一种更好的方法可以写 printstudent( studentn) 一百次。 问题是我不知道如何创建一个循环,所以从 student1 调用到 student100。我不能称之为学生 [i] 或者我可以吗?。

我愿意接受任何建议或想法谢谢!

#include <iostream>
#include <stdio.h>
#include <string.h>

using namespace std;

void printstudents(struct st student);

struct st {
  char familia[1000];
  char imia[1000];
  char otchestvo[1000];
  int gruppa;
  int grozhdenia;
};

int main() {

  struct st student1;
  struct st student2;
  struct st student3;

  //Информация студентов:

  strcpy(student1.familia,"Putin");
  strcpy(student1.imia,"Vladimir");
  strcpy(student1.otchestvo,"Vladimirovich");
  student1.gruppa = 40040;
  student1.grozhdenia = 1952;

  strcpy(student2.familia,"Gordon");
  strcpy(student2.imia,"Dymitro");
  strcpy(student2.otchestvo,"Aleksandrovich");
  student2.gruppa = 50050;
  student2.grozhdenia = 1953;

  strcpy(student3.familia,"Emelianenko");
  strcpy(student3.imia,"Fedor");
  strcpy(student3.otchestvo,"Olegovich");
  student3.gruppa = 60060;
  student3.grozhdenia = 1950;

  printstudents(student1);
  printstudents(student2);
  printstudents(student3);

  return 0;
}

void printstudents(struct st student) {
  printf("Student: %s %s %s,%d,%d \n",student.imia,student.otchestvo,student.familia,student.gruppa,student.grozhdenia);
}

解决方法

#include <stdio.h>
#include <string.h>

struct st;
void printstudents(const struct st *student);

struct st {
        char familia[1000];
        char imia[1000];
        char otchestvo[1000];
        int gruppa;
        int grozhdenia;
};

int
main(void)
{
        struct st student[3] = {
                { "Putin","Vladimir","Vladimirovich",40040,1952 },{ "Gordon","Dymitro","Aleksandrovich",50050,1953 },{ "Emelianenko","Fedor","Olegovich",60060,1950}
        };
        for( int i = 0; i < 3; i ++ ){
                printstudents(student + i);
        }

        return 0;
}

void
printstudents(const struct st * student)
{
        printf("Student: %s %s %s,%d,%d\n",student->imia,student->otchestvo,student->familia,student->gruppa,student->grozhdenia
        );
}
,

如果我们谈论的是执行速度和内存使用方面的实际性能,那么以下是最明显的瓶颈:

  • printf 及其格式字符串解析速度很慢。使用重复的 puts 调用可能比单个 printf 调用快得多。

  • 显然,您不应该将巨大的结构按值传递给函数。 struct st student 会导致几个 kb 的大型结构被复制到堆栈中,以防您的编译器无法内联函数调用。根据经验,永远不要按值传递结构。使用指针。

  • 您制作了常量字符串文字的硬拷贝。您可以只使用 const char* familia,然后执行比 student2.familia = "Gordon"; 快得多的 strcpy。不利的一面是,如果您这样做,您只能获得只读内存。

,

这是您的代码的修改,以使用静态堆栈分配的 3 个学生结构数组(以及一个用于初始化学生的辅助函数)。

您需要阅读指针的工作原理才能理解它,但这对您来说是 C。

#include <stdio.h>
#include <string.h>

struct st {
  char familia[1000];
  char imia[1000];
  char otchestvo[1000];
  int gruppa;
  int grozhdenia;
};

static void assign_student(struct st *student,const char *familia,const char *imia,const char *otchestvo,int gruppa,int grozhdenia) {
  // TODO: use strncpy
  strcpy(student->familia,familia);
  strcpy(student->imia,imia);
  strcpy(student->otchestvo,otchestvo);
  student->gruppa = gruppa;
  student->grozhdenia = grozhdenia;
}

static void print_student(struct st *student) {
  printf("Student: %s %s %s,%d \n",student->grozhdenia);
}

int main() {
  struct st students[3];
  assign_student(&students[0],"Putin",1952);
  assign_student(&students[1],"Gordon",1953);
  assign_student(&students[2],"Emelianenko",1950);
  for (int i = 0; i < 3; i++) {
    print_student(&students[i]);
  }
  return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。