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

C++: Why the whole string is not getting printed?

Windows 7、32 位、MSVS 2010

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

char szString[100] = "string";

编译器需要 101 个字符 spaces。 OS 将在 RAM 中分配这 101 个字符 space。

现在我将 7 个字符(包括 null)放入 szString,但 szString 的总大小为 100。所以我期望打印 szString 应该导致 string 加上从位置 szString 获取的 93 个垃圾值[7] 到 szString[99]。但是 cout 并不是这样的。它只打印 string

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

int main()
{
    using namespace std;

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

    return 0; 
}

输出

string 

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。

尝试打印最后 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;
}

我们得到 ascii 值 103 和 0。

上面有一篇短文here,不过简单说明一下:

以字符序列表示的字符串文字(例如 "string")按照约定 null 终止 ,这意味着在创建时 [=13=] (或空字符)添加到字符串的末尾。

这意味着这一行

char szString[100] = "string";

自动附加到

char szString[100] = "string[=11=]";

这也是为什么(窄)字符串文字比它包含的字符数大一个字节的原因:额外的字节由 [=13=] 占用,表示字符串的结尾。

std::cout 将忽略像 szString 这样的 char 数组中空字符后的所有数据,因此结果输出只是“string”。