空字符串和 '\0' 字符有什么区别? (从指针和数组的角度来看)
What's the difference between an empty string and a '\0' char? (from a pointer and array point of view)
作为这个问题的标题?有什么区别?
如果我写:
char *cp = "a";
cout << (cp == "a") << endl;
或:
string str = "a";
cout << (str == "a") << endl;
它们是一样的,而且都是 return 正确的。但是如果我写:
char *cp = "";
cout << (cp == "[=12=]") << endl;
它return是错误的。但是:
string str = "";
cout << (str == "[=13=]") << endl;
它return是真的。
我认为从指针和数组的角度来看它们应该是相同的。但事实证明它们是不同的。它们之间的细微差别是什么?我应该如何写一个char数组来表示一个空字符串?
好的,线上方的内容可能不清楚,就像有人说的那样 "a compiler optimization"。
我真正想要的是:
char *cp = "abcd";
可以给我这样的数组:['a'、'b'、'c'、'd'、'\0']。
我想知道如何使用类似的语法来获取这样的数组:['\0']。
因为我试过:
char *cp = "";
而且这似乎不是正确的代码。我认为它可以给我想要的东西。但事实并非如此。
对于行上方的歧义,我们深表歉意。我是新手,我不知道这可能是编译器优化。
字符串文字总是在末尾有一个隐含的 [=10=]
。所以 ""
是 const char[1]
类型,由一个 [=10=]
组成,而 "[=14=]"
是 const char[2]
类型,由 两个 [=33] 组成=] [=10=]
s。如果你想要空字符串文字,只需写 ""
。无需手动插入另一个 [=10=]
。
operator==(const char*, const char*)
比较指针,而不是字符。如果将两个不同的字符串文字与 ==
进行比较,则结果肯定为假。 (如果将两个由相同字符组成的字符串文字与 ==
进行比较,则结果不明确。)
std::string::operator==(const char*)
将参数视为 C 字符串。也就是说,它只会读到遇到第一个[=10=]
。因此,它无法区分 ""
和 "[=14=]"
.
"[=14=]"
实际上包含两个'[=15=]'
字符,其中一个是隐式创建的。
如果你写类似
char *cp = "a";
cout << (cp == "a") << endl;
你正在比较两个指针,而不是字符串内容(使用 strcmp()
来这样做),而
std::string cp = "a";
cout << (cp == "a") << endl;
比较第一个找到的内容 '[=15=]'
,因为 bool std::string::operator==(const char*)
超载了。
关于您的编辑:
Because I tried:
char *cp = "";
And it seems not the right code. I thought it could give me what I want. But it doesn't.
char* cp = "";
与
不完全相同
char cp[1] = { '[=13=]' };
因为字符串文字是使用静态存储位置创建的,而数组版本在堆栈上分配内存。
作为这个问题的标题?有什么区别?
如果我写:
char *cp = "a";
cout << (cp == "a") << endl;
或:
string str = "a";
cout << (str == "a") << endl;
它们是一样的,而且都是 return 正确的。但是如果我写:
char *cp = "";
cout << (cp == "[=12=]") << endl;
它return是错误的。但是:
string str = "";
cout << (str == "[=13=]") << endl;
它return是真的。
我认为从指针和数组的角度来看它们应该是相同的。但事实证明它们是不同的。它们之间的细微差别是什么?我应该如何写一个char数组来表示一个空字符串?
好的,线上方的内容可能不清楚,就像有人说的那样 "a compiler optimization"。
我真正想要的是:
char *cp = "abcd";
可以给我这样的数组:['a'、'b'、'c'、'd'、'\0']。 我想知道如何使用类似的语法来获取这样的数组:['\0']。 因为我试过:
char *cp = "";
而且这似乎不是正确的代码。我认为它可以给我想要的东西。但事实并非如此。
对于行上方的歧义,我们深表歉意。我是新手,我不知道这可能是编译器优化。
字符串文字总是在末尾有一个隐含的 [=10=]
。所以 ""
是 const char[1]
类型,由一个 [=10=]
组成,而 "[=14=]"
是 const char[2]
类型,由 两个 [=33] 组成=] [=10=]
s。如果你想要空字符串文字,只需写 ""
。无需手动插入另一个 [=10=]
。
operator==(const char*, const char*)
比较指针,而不是字符。如果将两个不同的字符串文字与 ==
进行比较,则结果肯定为假。 (如果将两个由相同字符组成的字符串文字与 ==
进行比较,则结果不明确。)
std::string::operator==(const char*)
将参数视为 C 字符串。也就是说,它只会读到遇到第一个[=10=]
。因此,它无法区分 ""
和 "[=14=]"
.
"[=14=]"
实际上包含两个'[=15=]'
字符,其中一个是隐式创建的。
如果你写类似
char *cp = "a";
cout << (cp == "a") << endl;
你正在比较两个指针,而不是字符串内容(使用 strcmp()
来这样做),而
std::string cp = "a";
cout << (cp == "a") << endl;
比较第一个找到的内容 '[=15=]'
,因为 bool std::string::operator==(const char*)
超载了。
关于您的编辑:
Because I tried:
char *cp = "";
And it seems not the right code. I thought it could give me what I want. But it doesn't.
char* cp = "";
与
不完全相同char cp[1] = { '[=13=]' };
因为字符串文字是使用静态存储位置创建的,而数组版本在堆栈上分配内存。