我在c ++编程语言中看到一些建议,比如“在结构类型中不使用char”,
struct Student{
int stdnum, FieldCode, age;
double average, marks, res[NumOfCourses];
char Fname[20], Lname[20], cmp[20];
};
最好使用:
struct Student{
int stdnum, FieldCode, age;
double average, marks, res[NumOfCourses];
string Fname, Lname, cmp;
};
欢迎就此事提出任何其他建议
提前谢谢
答案 0 :(得分:8)
因为使用C级原始字符数组的字符串处理难以正确,容易出现故障,并且当它失败时,它可能会失败。
使用更高级别的字符串数据类型,您的代码变得更容易编写,更可能是正确的。获得更短的代码通常也更容易,因为string
数据类型为您做了很多工作,否则您必须自己做。
原始问题标有c标记,但当然string
是c++构造,因此此答案不适用于C.在C中,您可以选择使用一些字符串库(glib's GString is nice)来获得类似的好处,但当然你永远不会像C ++那样重载运算符。
答案 1 :(得分:3)
@ unwind的答案通常是完全合适的,除非它真的是你所追求的20个字母的序列。在这种情况下,std :: string可能过度杀伤(性能方面),但std :: array可能仍然更好。
答案 2 :(得分:2)
对于你的学生班,你有名字,姓氏和“cmp” - 我不知道应该是什么。显然,学生可以拥有超过20个字符的名字和/或姓氏,因此通过硬编码20个元素的数组,您已经创建了一个系统:
如果您 不 在修改阵列时仔细检查所有输入处理,您的程序可能会崩溃,损坏数据和/或出现故障。
使用std::string
,您通常可以让人们键入您的用户界面所具有的任何字段,或者从文件,数据库或网络中获取数据,并存储您提供的任何内容,打印您所拥有的任何内容给予,添加额外的字符,而不必担心超过该阈值等。在您不能信任您的输入源(例如,通过不受信任的网络连接接受学生数据)的极端情况下,您可能仍希望进行一些长度和内容检查,但你很少发现有必要让那些遍及所有代码的代码以数组边界检查的方式经常需要。
有一些性能影响:
new[]
),并且分配例程可能会分配更多的内存比你实际要求的,或由于碎片而无法有效地重用delete[]
内存std::string
实现碰巧在复制的std::string
个对象之间共享一个缓冲区(直到一个或者可能被修改),那么std::string
可能会减少你的内存使用量学生struct
有多个副本 - 但这可能只是暂时发生,只能帮助很长的字符串很难从阅读所有这些因素中得出很多结论 - 如果您关心应用程序中潜在的性能影响,您应该始终使用您的实际数据和使用情况进行基准测试。
另外,std::string
直观易用,支持+
,+=
,==
,!=
,<
等运营商,因此,您更有可能编写易于理解和维护的正确,简洁的代码。
答案 3 :(得分:1)
我不认为它在C
中也有所不同。
检查这个珍贵的stackoverflow答案,明确说明strings
状态比char *
更安全。