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++:为啥没有打印整个字符串?的主要内容,如果未能解决你的问题,请参考以下文章

为啥当我为 C++ 代码打印字符时,我的终端会发出哔声?

为啥打印 char* 会给出字符串而不是地址? [复制]

为啥 if 语句没有打印出字符串? cpp

为啥我的字符串没有被打印?

为啥数组不打印第一个元素?

为啥我的 if 函数没有从字符串中删除空格?它不能检测 C++ 中的空格输入吗?有没有办法从输入中删除空间