我被字符串和数组困住了
Posted
技术标签:
【中文标题】我被字符串和数组困住了【英文标题】:I am stuck with string and array 【发布时间】:2016-04-01 16:52:17 【问题描述】:我遇到了一个 c++ 代码:
char greeting[6] = 'H', 'e', 'l', 'l', 'o', '\0';
cout << "Greeting message: ";
cout << greeting << endl;
输出:Hello
由于问候语是一个大小为 6 的数组,因此显示问候语应仅显示“H”,因为 cout
中的 greeting[0]
,因为它显示的是数组的第一个地址。我不知道我错在哪里。
【问题讨论】:
请说明为什么您希望它只显示“H”。您正在打印greeting
而不是 greeting[0]
greeting
衰减成一个指针 char *
并且它指向的整个字符串将被打印出来。如果您只想打印第一个字符,请使用 cout << greeting[0] << endl;
。
这是 cout 显示字符串的方式...因为 greeting 是一个字符串,这就是 cout 显示 "Hello" 但如果你写 "greeting[0]" 那么 cout 将显示 'H' 作为字符...
operator <<
的 char *
类型被重载以从给定地址开始并打印字符,直到找到 \0
。
问候不是代表数组的第一个值吗?
【参考方案1】:
除非它是sizeof
或一元&
运算符的操作数,否则将转换类型为“N
-元素数组T
”的表达式(“decay ") 类型为“指向T
”的表达式,表达式的值将是数组第一个元素的地址。
这意味着在声明中
cout << greeting << endl;
表达式greeting
从char [6]
类型的表达式转换为char *
类型的表达式,表达式的值是第一个元素的地址。
流操作符<<
被定义为如果它接收到char *
类型的参数,它将写出从该地址开始的字符序列,直到它看到0 终止符;这是它如何工作的一个简单示例:
std::ostream& operator<<( std::ostream& s, char *p )
while (*p)
s.put( *p++ );
return s;
真正的运算符定义会稍微复杂一些,但这是基本思想。
如果您只想打印出greeting
的第一个字符,则必须显式索引或取消引用它:
cout << greeting[0] << endl;
或
cout << *greeting << endl;
【讨论】:
【参考方案2】:greeting
decays to a pointer 本身。但如果听起来很复杂,您可以将其视为一个指针,以了解 cout
的作用。
cout
方法打印从greeting[0]
到\0
的字符。
【讨论】:
【参考方案3】:如果要查看地址值写入
char greeting[6] = 'H', 'e', 'l', 'l', 'o', '\0';
cout << "Greeting message: ";
cout << (void*)greeting << endl;
// ^^^^^^^
std::ostream& std::operator<<(std::ostream&, T type);
提供 const char*
、const char[]
和 char
类型的特化。
【讨论】:
【参考方案4】:是的,这里的问候是指向数组中第一个元素的指针,所以如果你这样做: cout
【讨论】:
以上是关于我被字符串和数组困住了的主要内容,如果未能解决你的问题,请参考以下文章
我被这个错误困住了。当我按照所有步骤在heroku上部署角度应用程序时