C++ C++;:为什么整个字符串没有打印出来?

C++ C++;:为什么整个字符串没有打印出来?,c++,string,C++,String,Windows 7,32位,MSVS 2010 我的理解是,当您这样做时: char szString[100] = "string"; 编译器需要101个字符空间。然后,操作系统将在RAM中分配这101个字符的空间 现在我在szString中放入7个字符(包括null),但是szString的总大小是100。因此,我希望打印szString会导致string加上93个从位置szString[7]到szString[99]的垃圾值。但库特并没有这样做。它只打印字符串 那么机制是什么呢?我的理解

Windows 7,32位,MSVS 2010

我的理解是,当您这样做时:

char szString[100] = "string";
编译器需要101个字符空间。然后,操作系统将在RAM中分配这101个字符的空间

现在我在szString中放入7个字符(包括null),但是szString的总大小是100。因此,我希望打印szString会导致
string
加上93个从位置szString[7]到szString[99]的垃圾值。但库特并没有这样做。它只打印
字符串

那么机制是什么呢?我的理解错了吗

int main()
{
    using namespace std;

char szString[100] = "string";
cout << szString;

    return 0; 
}

所以我希望打印szString会导致string加上93个垃圾值,这些垃圾值从位置szString[7]到szString[99]。

这是一个错误的假设。字符串是以\0结尾的空字符数组,在ASCII中称为NUL

尝试打印最后2个值:

#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;
}
#包括
#包括
使用名称空间std;
int main()
{
使用名称空间std;
char szString[100]=“string”;
int len1=szString[5],len2=szString[6];

cout有一篇关于它的短文,但要简单解释一下:

字符序列中表示的字符串文字(如
“string”
)按惯例以null结尾,这意味着在创建时将
\0
(或null字符)添加到字符串的末尾

这意味着这条线

char szString[100] = "string";
自动附加到

char szString[100] = "string\0";
这也是(窄)字符串文字比它所包含的字符数大一个字节的原因:额外的字节被
\0
占用,表示字符串的结尾


std::cout
将忽略
char
数组(如szString)中空字符后的所有数据,因此结果输出仅为“
string
”“谢谢你的回答。内存操作系统将分配多少?7或101?@ USER 38 91236 -代码101>代码>但是,只有字符串的长度加上<代码> NUL< /Cl>字符才是使用的。为什么它是C++的标准,它是这样定义的?行为是字符串如何工作的——CUT打印直到NUL终止符。。正在打印整个字符串。字符缓冲区包含一个六字符字符串、一个nul终止符,然后是一堆从未初始化过的垃圾。@DavidSchwartz什么是“垃圾堆”?一些值?但我们从不初始化值,对吗?我们初始化内存位置。对吗?如果缓冲区有所有这些垃圾,为什么它没有到达控制台?(我以为缓冲区只有空值,然后这个缓冲区由cout打印)垃圾在字符串后面。您要求
cout
打印字符串,它打印了。
char szString[100] = "string\0";