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

时间:2015-01-05 06:26:43

标签: c++ string

Windows 7,32位,MSVS 2010

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

char szString[100] = "string";

编译器将需要101个char空间。然后OS将在RAM中分配这101个字符空间。

现在我在szString中放了7个字符(包括null),但是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 

2 个答案:

答案 0 :(得分: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。

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

答案 1 :(得分:1)

有一篇简短的文章here,但要简要解释一下:

字符序列中表示的字符串文字(例如"string")按惯例 null终止,这意味着在创建时\0(或空字符)是添加到字符串的末尾。

这意味着这一行

char szString[100] = "string";

自动附加到

char szString[100] = "string\0";

这也是(窄)字符串文字比它所拥有的字符数大一个字节的原因:额外字节由\0占用,表示字符串的结尾。

std::cout会忽略char数组中的空字符之后的所有数据,例如szString,因此结果输出只是“string”。