我对程序员在C和C++中编写代码的基本方法有些模糊。其中一个特别的问题是在C++中使用字符串还是字符数组,或者反之。那么,通常情况下应该使用字符串或字符数组,为什么?
我对程序员在C和C++中编写代码的基本方法有些模糊。特别是关于在C++中使用字符串和使用字符数组之间的区别。所以,在一般情况下,是应该使用字符串还是字符数组,以及为什么呢?
在C++中,几乎所有情况下应该使用std::string
而不是原始的char数组。
std::string
为您管理底层内存,这本身就足以成为首选的理由。
它还提供了一个更易于使用和更可读的接口,用于常见的字符串操作,例如平等测试,连接,子字符串操作,搜索和迭代。
如果您正在修改或返回字符串,请使用std::string
。 如果不是,除非您绝对需要std::string
成员函数,否则将参数接受为const char*
。 这使得您的函数不仅可以使用std::string::c_str()
,还可以使用字符串字面值。 为什么要让调用者为了传递文字字面量而付出构造带有堆存储的std::string
的代价呢?
char*
类型不能直接转换为string
类型。但是可以使用char*
类型构造一个string
类型,这会引起堆内存的分配和碎片化。(请不要点踩,除非您对我回答的最后一句话有回应) 反过来则可以通过c_str()
成员函数实现,这是我在回答中已经提到的。指针既不仅用于向后兼容,也不只用于保存单个值。相反,它们很好地充当了迭代器的角色,所有标准库算法都被精心设计以确保如果迭代器是指针,则能够正确工作。 - Ben Voigtstring
是可以从char*
转换的:一个非显式的单参数构造函数是一个“转换构造函数”,属于用户定义的转换类别。当然,这并不意味着调用它是廉价的。 - James McNellisconst char*
不仅可以指向字面量而无需转换,还可以指向 std::vector
、std::string
中间、全局指针或从字面量初始化的输入参数等。在我编写的软件中,几乎所有字符串的使用都属于这些类别之一。虽然本地化时比例会少一些,但并不会少很多。参数解析不会被本地化,日志文件和错误代码也不会(在任何理智的系统中)。对于搜索引擎来说,甚至连错误消息是否应该本地化都是一个问题。 - Ben Voigt其他人已经提出了这个建议。尽可能使用std::string。但是有些情况下,你需要char *,例如如果你想调用一些系统服务。
std::string::c_str()
。 - swegichar*
而不是一个const char*
(例如,大多数WinAPI)。在这些情况下,使用std::vector<char>
并根据需要在它和std::string
之间进行转换是一个好主意。 - James McNellischar*
的函数不会修改字符串。如果函数尝试修改字符串,你就会陷入未定义行为的领域。 - James McNellis与所有事情一样,选择取决于你的使用场景。如果你处理的是会变化的字符串数据,那么 std::string 有其真正的价值。但如果你处理的是不会变化的字符串,char[] 在效率上无可匹敌。
std::string
。你会遇到更少的问题(我认为几乎没有,至少我想不出来)与缓冲区大小有关。C语言有char[],而C++还有std::string...
我经常听到应该“拥抱语言”,按照这个规则,你应该使用std::string...
然而,这基本上取决于你使用的库,该库希望你如何表达字符串等因素。
std::string是一个容器类,在它内部是一个char[]
如果你使用std::string,你会有很多优势,比如一些函数可以帮助你[比较、子串等]