cout的注意点

蹲街弑〆低调 提交于 2020-02-01 19:19:38

最近遇到几个cout的坑,虽然都是小问题,好记性不如烂笔头

输出char数组

当输出char数组时,只需要给cout一个地址,cout从这个地址开始出书,直至遇到空白符(空格,缩进,换行)。

直接看代码

#include <iostream>
using namespace std;
int main()
{
	char str[6] = "hello" ;
	cout << str<<endl;
	return 0;
}

在这里插入图片描述

输出正确!如果我们把char数组的个数6换成5会怎么样呢?

这样编译无法通过,系统会认为str空间至少为6;因为直接把一个字符串复制给char数组时,会自动在最后面留出一个空位置,这样cout就能截止。

我们强制把char数组最后一个位置的空字符替换掉。

#include <iostream>
using namespace std;
int main()
{
	char str[6] = "hello" ;
	str[5] = '!';
	cout << str<<endl;
	return 0;
}

在这里插入图片描述

这里就出现了乱码,因为char数组后面的内存并不是空的,所以cout会一直输出,直到遇到空字符为止。

这种情况在一些处理字符串的过程中,如使用算法copy()进行字符串的内容复制时可能会出现,一定要保证复制完后,目标字符串后面有空字符,保证不会输出乱码。此外在输出单个字符char,即char变量时,是不安全的,一定要扩大成char数组并保证结尾有空字符再输出。

对于string,由于其数据结构申请的内存往往比string本身大,但字符刚好存满内存这种情况是可能存在的,即string处于申请扩容的临界状态,因为为了安全起见,copy()完后,加上这样一行代码来保证输出安全:

str=str+'\0';

再来看一个代码

#include <iostream>
using namespace std;
int main()
{
	char str[10];
	str[0] = 'h';
	str[1] = 'e';
	str[2] = 'l';
	str[3] = 'l';
	str[4] = '0';
	cout << str<<endl;
	cin.get();
	return 0;
}

在这里插入图片描述

这里char数组的空间足够大,为什么会输出乱码呢?

原因是char未初始化!int 变量未初始化会默认为0,但int数组,char变量,char数组通通不会!

输出int数组

#include <iostream>
using namespace std;
int main()
{
	int A[10] = { 0,1,2,3,4,5,6,7,8,9 };
	cout << A << endl;
	return 0;
}

在这里插入图片描述

并不能正常输出,总结如下:

c++中数组的名称代表数组第一个元素的地址,比如输出一个整形数组名称时,会得到这个整形数组第一个元素的地址。 但是当输出字符数组名称时,并不会得到这个字符数组的首地址,而是直接输出整个字符数组的内容;这是因为c++对操作符<<进行了重载,当参数为char*时,会输出char *指向的所有内容。

正确的姿势是:

int main()
{
	int A[10] = { 0,1,2,3,4,5,6,7,8,9 };
	for (int a : A)
		cout << a;
	return 0;
}

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!