最近遇到几个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;
}
来源:CSDN
作者:圣颖君
链接:https://blog.csdn.net/weixin_45252450/article/details/104135138