我喜欢C,我有一本名为Full and Full C和2 C ++的C书,我发现这些语言非常棒,因为它们具有令人难以置信的强大功能和性能,但由于各种类型,我必须结束我的许多项目。 / p>
我说要std::string
,LPCSTR
,System::String
,TCHAR []
,char s [] = "ss"
,char * s
?
这主要在GUI应用程序中引起了巨大的麻烦,WinAPI存在LPCSTR
与char或std::string
不兼容的问题,现在在CLR应用程序中如果它有System::String
给出了转换为std::String
或char * s
甚至是char s []
很多头痛。
为什么C / C ++的字符串类型不像Java中的String
那样唯一?
答案 0 :(得分:9)
c ++中没有“多种类型的字符串”。通常,有一个模板std::basic_string
,它基本上是一个专门用于不同字符类型字符串的容器。
std::string
是std::basic_string<char>
上的便捷typedef。对于不同的底层字符类型,还有更多这样的typedef。
AFAIK,标准c也只有一个官方认可的字符串标准。它是ANSI字符串,即char
的空终止数组。
你提到的所有其他内容都是等效的(例如LPCSTR
是指向常量字符串的长指针,即const char*
),或者是由库提供者编写的一些非标准扩展。
你的问题就像问为什么有这么多的GUI库。因为没有标准的方法可以做到这一点,或者标准方式在某种程度上缺乏,并且提供和支持自己的等效类型是一个设计决策。
底线是,在图书馆一级或语言层面,它是不同权衡之间的设计决策。简单,性能,角色支持等。通常,storing text is hard。
答案 1 :(得分:4)
嗯,首先我们必须回答这个问题:什么是字符串?
C标准将其定义为由第一个空字符终止并包括第一个空字符的连续字符序列。 1
它还提到使用wchar_t
,char16_t
或char32_t
代替char
的变种。
它还为字符串操作提供了许多函数,并为符号方便提供了字符串文字。
因此,一系列字符可以是字符串,char[]
可以包含字符串,而char*
可能指向一个字符串。
LPCSTR
是const char*
的Windows typedef,其添加的语义应指向字符串或NULL
。
TCHAR
是用于将Windows代码从char
转换为wchar_t
的许多预处理程序定义之一。根据{{1}}的内容,TCHAR
可能会包含字符串或宽字符串。
C ++混合了一些东西,因为它添加了一个数据类型来处理字符串。为了减少歧义, string 仅用于抽象概念,您必须依赖上下文来消除歧义或更明确。
所以C 字符串对应于C ++ null-terminated-byte-string 或 NTBS 。 2
是的,C ++也知道它们的广泛种类
C ++结合了C函数并增加了一些功能
此外,C ++有TCHAR[]
用于存储所有类型的计数字符串,还有一些便利类型的求助,如std::basic_string<>
。
现在我们开始使用第三种语言,即C ++ / CLI
其中包含了我在C ++上面提到的所有内容,并将CLI类型std::string
添加到组合中
System::String
是一个不可变的UTF-16计数字符串。
现在回答一个问题,为什么C ++没有定义一个单独的具体类型作为字符串可以回答:
C ++中有不同类型的字符串,用于互操作性,历史记录,效率和便利性。始终使用正确的工具来完成工作 Java和.Net对字节数组,字符数组,字符串构建器等执行相同的操作。
参考文献1:C11最终草案,字符串的定义:
7。库
7.1简介
7.1.1术语的定义
1 string 是由第一个空字符终止并包含第一个空字符的连续字符序列。有时使用术语多字节字符串来强调对字符串中包含的多字节字符的特殊处理,或避免与宽字符串混淆。 指向字符串的指针是指向其初始(最低寻址)字符的指针。 字符串的长度是空字符前面的字节数,字符串的值是按顺序包含的字符值的序列。
参考文献2:C ++ 1z草案n4659 NTBS:
20.4.2.1.5.1字节字符串
System::String
1 以空字符结尾的字节字符串或 NTBS 是一个字符序列,其定义内容的最高寻址元素的值为零(终止空字符);序列中没有其他元素的值为零.163 2 NTBS 的长度是终止空字符前面的元素数。 空 ntbs的长度为零 3 NTBS 的值是元素的值序列,包括终止空字符。
4 static NTBS 是 NTBS ,具有静态存储持续时间.164
答案 2 :(得分:0)
每个字符串类型都有自己的目标,std::string
用于标准库,这是最常见的。
正如您所说,C ++具有强大的功能和性能,这些字符串可以提供更大的灵活性。您可以使用Char[]
和char*
来更通用地使用字符串。
答案 3 :(得分:-8)
C ++和Java在许多方面似乎相似,但存在一些基本的哲学差异。 C ++ - 最初被认为是“带有类的C”是建立在C的传统之上的,这意味着它具有巨大的力量,并且包含了操纵系统各个方面的能力。
权力意味着通常有许多不同的方法 - 包括代表字符串。特别是C / C ++为您提供了内存指针,这意味着您可以以或多或少的方式处理内存块。您在上面引用的许多“字符串”都是基于指针。
尽管如此,这种能力带来了巨大的风险:无论是偶然还是设计,用C / C ++编写代码并不太困难。
Java - 至少开箱即用 - 限制了你操纵系统的能力(因为你无论如何都不能访问它,而是通过可以对坏事进行沙箱处理的虚拟机)并强制执行更严格的类型检查 - 特别重要的是没有指针和没有强制转换(即无法将内存块指定为任意类型)。
因此,Java旨在帮助您编写更安全,更正确的代码,并且(至少在1995年)具有更强的表达能力。但这都是有代价的,其中一部分是程序员被迫进入该语言的电车线路。
在Java中,这意味着字符串表示的选项仅限于String类和空终止数组。