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

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

本文关键字:字符串 打印 为什么 C++      更新时间:2023-10-16

Windows 7, 32 位 , MSVS 2010

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

char szString[100] = "string";

编译器需要 101 个字符的空格。 然后,操作系统将在 RAM 中分配这 101 个字符的空间。

现在我在 szString 中输入 7 个字符(包括 null),但 szString 的总大小为 100。所以我预计打印 szString 应该会导致从位置 szString[7] 到 szString[99] 的 string 加上 93 个垃圾值。但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 结尾的 null 字符数组,在 ASCII 中称为 NULL。

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

这里有一篇关于它的简短文章,但要简要解释一下:

以字符序列表示的字符串文本(如 "string")按照惯例是 null 结尾,这意味着在创建时,(或 null 字符)被添加到字符串的末尾。

这意味着这条线

char szString[100] = "string";

自动追加到

char szString[100] = "string";

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

std::cout将忽略char数组(如 szString)中空字符后的所有数据,因此结果输出只是"string"。