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::strings。 你说的是真的,但是下面的代码如何编译并产生正确的输出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 样式字符串转换为 c++ 样式字符串

将 c++ dll 的 char 指针数组传递给 c# 字符串

C++怎么把string 转换为char型数组

C 或 C++。如何比较给定 char * 指针的两个字符串?

C++:指向 std::string 转换的 char 指针是不是复制内容?

C++ 字符(char)指针