C语言结构体和函数指针实现示例:Person结构体优化建议
"#include "stdio.h"\n#include "string.h"\n\n\n//独立的声明文件 Person.h\n#define MAXNAMELEN 20\ntypedef struct _Person{\n\tchar name[MAXNAMELEN];\n\tint age;\n\tvoid (*printMe)(void);\n\tvoid (*add)(void);\n}Person;\n\n\n//初始化函数,形成正确的调用关系\nvoid initPerson();\n\nvoid PrintMe(void);\nvoid Add(void);\n\n\n//声明一个当前对象\nPerson person;\n\n\n//独立的定义文件 Person.c\n\nvoid PrintMe(void)\n{\n\tprintf("%s,%d\n",person.name,person.age);\n\treturn;\n}\n\nvoid Add(void)\n{\n\tchar tempName[MAXNAMELEN] = {'a'};\n\tint tempAge = 1;\n\tprintf("Please input name(1-19 character):");\n\tgets(tempName);\n\tprintf("Please input age(1-99 Integer):");\n\tscanf("%d",&tempAge);\n\tstrcpy(person.name,tempName);\n\tperson.age = tempAge;\n\treturn;\n}\n\nvoid initPerson()\n{\n\tperson.printMe = PrintMe;\n\tperson.add = Add;\n}\n\n\n//独立的客户端代码文件 main.c\nint main()\n{\n\tinitPerson();\n\t\n\tperson.add();\n\tperson.printMe();\n\treturn 0;\n}\n\n以上代码请告诉我不合理的地方内容:1. 使用了全局变量person,可能会造成命名冲突和不必要的耦合。应该将person作为局部变量传递给需要使用它的函数。\n\n2. 使用了不安全的输入函数gets(),应该使用更安全的输入函数fgets()来避免缓冲区溢出。\n\n3. initPerson()函数应该放在Person.c文件中,而不是放在独立的声明文件中。\n\n4. 在Add函数中,应该添加输入验证来确保输入的姓名和年龄的合法性。\n\n5. 在main函数中,应该检查输入的返回值以确保输入成功。\n\n6. 没有对输入的姓名和年龄进行长度和范围的限制,可能导致缓冲区溢出和无效的输入。\n\n7. 没有对输入的姓名进行字符串长度的检查,可能导致字符串长度超过最大限制。\n\n8. 没有对输入的年龄进行范围的检查,可能导致无效的年龄输入。\n\n9. 没有处理输入中的换行符,可能导致输入的姓名和年龄包含换行符。\n
原文地址: https://www.cveoy.top/t/topic/p8s2 著作权归作者所有。请勿转载和采集!