问题描述
我想知道是否有更有效的方式(更少的行,更少的内存)来打印字符串中包含的信息。我在循环思考功能参数。例如,如果您需要打印 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;
}