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
”。
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
”。