C++ 是不是将 char 指针视为 c 样式字符串?
Posted
技术标签:
【中文标题】C++ 是不是将 char 指针视为 c 样式字符串?【英文标题】:Does C++ treat char pointers as c style strings?C++ 是否将 char 指针视为 c 样式字符串? 【发布时间】:2021-03-06 13:11:22 【问题描述】:C++ 是否将 char 指针视为 c 风格的字符串?
int main(int argc,char* argv[])
if (argv[1] == "-d")
argv[1] 包含一个 char 指针,argv[1] == "-d"
语句如何不会导致编译器抛出错误,因为 "d"
是一个字符串,而 argv[1]
是一个指向 char 值的指针
【问题讨论】:
长话短说,你需要使用strcmp
。
在表达式argv[1] == "-d"
中,编译器将"-d"
转换为一个指针(等于'-'
在字符串"-d"
中的地址)并计算argv[1]
是否等于该指针(通常会测试false
)。如果要将argv[1]
视为字符串(char
的数组以nul 结尾)并将该字符串的内容与字符串文字的内容进行比较,则执行std::strcmp(argv[1], "-d") == 0)
。或者,根据您的用例可能更好,从 argv[1]
和 "-d"
创建 std::string
对象,并使用 ==
运算符比较这些 std::string
s。
你说的是真的,但是下面的代码如何编译并产生正确的输出int main() char* ptr[1]; char c[] = "Hello"; ptr[0] = c; std::string d = ptr[0]; std::cout << d;
如何将指针分配给字符串
您需要了解指针和数组(以及字符串,在技术上是具有特定特征的数组)是不同的东西。他们可以被对待——在某些情况下,但在其他情况下——就好像它们是同一件事一样。要了解为什么您的最后一个示例有效,但您的问题中的示例无效,您需要了解何时可以将指针和数组视为相同的事物,以及何时不能。以这种格式要完整地解释这一点。
@SwarajSonavane 我的印象是,您对什么是“字符串”的理解存在缺陷,这导致您提出这些问题。也许其中的一部分:"-d"
是一个字符串文字,它只是 C 风格字符串的一种特例;有些 C 风格的字符串不是字符串文字。
【参考方案1】:
因为
"d"
是一个字符串,而argv[1]
是一个指向char
值的指针
那是你有点错误的朋友。
argv[1]
在这种情况下是 char*
,就像你说的那样。
"-d"
是一个const char[3]
(-d
加上空终止符),这个数组可以衰减为一个指针,这意味着==
可以编译。
正如 cmets 中指出的那样,这可能不会像您期望的那样做。这将进行指针比较,而不是实际字符串的比较。为此,您需要使用 strcmp
。
【讨论】:
但是不要忘记,这里的works仅仅意味着它编译。它不会做你期望它做的事情。 @SwarajSonavane 是的,他们会的(不包括黑魔法)。以上是关于C++ 是不是将 char 指针视为 c 样式字符串?的主要内容,如果未能解决你的问题,请参考以下文章
将 c++ dll 的 char 指针数组传递给 c# 字符串
C 或 C++。如何比较给定 char * 指针的两个字符串?