C++:为啥没有打印整个字符串?
Posted
技术标签:
【中文标题】C++:为啥没有打印整个字符串?【英文标题】:C++: Why the whole string is not getting printed?C++:为什么没有打印整个字符串? 【发布时间】:2015-01-05 06:26:42 【问题描述】:Windows 7、32 位、MSVS 2010
我的理解是当你这样做时:
char szString[100] = "string";
编译器需要 101 个字符空格。然后操作系统将在 RAM 中分配这 101 个字符空间。
现在我在 szString 中放入 7 个字符(包括 null),但 szString 的总大小为 100。所以我期望打印 szString 应该导致 string
加上从位置 szString[7] 获取的 93 个垃圾值到szString[99]。但 cout 的行为并非如此。它只打印string
那么机制是什么?我的理解错了吗?
int main()
using namespace std;
char szString[100] = "string";
cout << szString;
return 0;
输出
string
【问题讨论】:
正在打印整个字符串。字符缓冲区包含一个六字符的字符串、一个 nul 终止符,然后是一堆从未初始化过的垃圾。 @DavidSchwartz 什么是“一堆垃圾”?一些价值观?但是我们从不初始化值,对吧?我们初始化内存位置。我对吗 ?如果缓冲区有所有这些垃圾,为什么它没有到达控制台? (我认为缓冲区只有值直到 NULL,然后这个缓冲区由 cout 打印) 垃圾在字符串后面。你让cout
打印字符串,它确实做到了。
【参考方案1】:
So I am expecting that printing szString should result in string plus 93 garbage values taken from location szString[7] to szString[99].
这是一个错误的假设。字符串是一个以 \0 结尾的空字符数组,在 ASCII 中称为 NUL。
尝试打印最后两个值:
#include <iostream>
#include <cstdio>
using namespace std;
int main()
using namespace std;
char szString[100] = "string";
int len1 = szString[5], len2 = szString[6];
cout << len1 << endl;
cout << len2 << endl;
return 0;
我们得到 ascii 值 103 和 0。
【讨论】:
感谢您的回答。操作系统将分配多少内存? 7 还是 101? @user3891236 -101
但是只有字符串的长度加上nul
字符才被使用。
为什么会这样?是否在 C++ 标准中定义了 cout 的行为方式?
行为是字符串的工作方式 - cout 一直打印到 nul 终止符。【参考方案2】:
上面有一篇短文here,不过简单解释一下:
以字符序列表示的字符串字面量(例如"string"
)按照约定空终止,这意味着在创建时将\0
(或空字符)添加到末尾的字符串。
这意味着这一行
char szString[100] = "string";
自动附加到
char szString[100] = "string\0";
这也是为什么(窄)字符串文字比它所包含的字符数大一个字节的原因:额外的字节被 \0
占用,表示字符串的结尾。
std::cout
将忽略 char
数组(如 szString)中空字符后的所有数据,因此结果输出只是“string
”。
【讨论】:
以上是关于C++:为啥没有打印整个字符串?的主要内容,如果未能解决你的问题,请参考以下文章