第十八章 1char型字符串

#include <iostream>
using namespace std;
int main()
{
    //char man[12];
	//cin.get(man,12);
	//cin.get的结束标志是"\n",也就是换行,因此遇到空格不会结束,而是把空格也看做一个空字符,同时在输入结束后,也就是用户输入一个回车后,
	//cin.get自动为当前接受输入的数组添加字符串结束标志'\0',因此它实际保存的有效字符是它的第二个参数减一,在本例中是(12-1)11个字符
	//cout<<man<<endl;

	//但是与cin不同的是,cout可以输入空格,制表符等空字符,或者说不可见字符
	//要注意空格与空字符还是有本质的区别的
	//空格的ASCII码为32, 而空字符的ASCII码为0

	//注意32没有加上单引号,这样编译器就会根据ASCII码值来寻找字符,ASCII码值为32的字符是空格,这样就会将空格保存到数组man中
	//char main[] = {'a',32,'b'};
	//这里因为我们没有给数组man加入一个字符串结束标志,由于cout遇到字符串结束才会停止输出
	//所以导致了输出完所有数组man的内容还要继承输入错误操作,又叫越界

	//char man[] = {'a',32,'b','\0'};

	//将空格换成空字符后试试
	//char man[] = {'a',0,'b','\0'};
	//cout遇到空字符就会停止输出,因此空字符后面的b没有输出,只输出了a
	//这就是关于输入和输出的一些问题,cin遇到不中见字符和空格就停止输入
	//(不可见字符指的是制表符和空格)
	//而cout则只是遇到空字符才停止输入。
	//这就是为什么将空字符作为字符串结束标志的原因,cin和cout遇到空字符都结束输入和输出操作

	//char man[] = {"a b"};
	//用双引号包括起来的字符串隐含了字符串结束标志'\0',因此你不用手动去添加它,这样的写法明显示要比刚才省事多了
	//也可以指定字符数组的长度,也可以不指定
	//这样可以防止在要存储的字符很多时,超出数组末尾写入数组,也就是数组越界,当然这样的坏处就是浪费空格,因为处理字符串的函数根据空字符的位置,而不是字符串的长度来处理,所以你为main数组多开辟出来的那些内存空格除了系统纳存之外没有什么实际用途。另外。c++不限制字符串长度,也就是说你可以将字符串数组的长度定义为无限大

	//cout<<man<<endl;



	//计算字符串长度时不要忘记了后台的结束符'\0'
	char main[12] = {"hello world"};
	cout<<main<<endl;
	cout<<"strlen(main):"<<strlen(main)<<endl;//11
	//strlen求出的是可见字符的长度,而结束符不可见,所以没有计算出来
    cout<<"sizeof(main):"<<sizeof(main)<<endl;//包括不可见字符

	main[5]='\0';
	cout<<main<<endl;
	cout<<"strlen(main):"<<strlen(main)<<endl;//11
	//strlen返回的是字符串结束标志'\0'之前的字符串长度,而不是数组长度,所以返回的是5
	//因为第6个字符串是字符串结束标志,不计算在内
	cout<<"sizeof(main):"<<sizeof(main)<<endl;//包括不可见字符
	//sizeof返回的是数组的长度,也就是该数组共有多少个元素


	return 0;
}

  

posted @ 2012-09-19 23:11  简单--生活  阅读(528)  评论(0编辑  收藏  举报
简单--生活(CSDN)