1、定义数组中的整数:数组的个数(即长度)
数组在运行中的整数:索引,即偏移量(到数组第一个元素的偏移量)
int a[4]; //分配连续4个int类型的内存单位,但未初始化(里面的值是垃圾值),这个数组占用内存大小4X6=24字节。
2、初始化列表(初始化集合)的妙用。
如果列表中元素少于数组个数,则其余初始化为0,就即使列表中一个元素都没有,也全部初始化为0.
int a[200]={ }; //数组中所有元素初始化为0.
3、char类型数组有两种 :
一是字符数组:元素为字符,初始化不全时,按上面2处理,为0,注意不是字符'0',而是直接0,转为字符就是NULL
二 是一个”字符串“,这个字符串对应每个数组元素,且结束‘\0'也是占一个元素,所以字符串个数应比数组长度“至少”少1.
注意,后面学的string和字符串有区别,它没有'\0'的占用元素。
4、对于字符串作为数组进行输入时(即用cin),会出现意想不到结果。
因为cin是把空白字符作为结束,当输入中有空白字符就自动截流了。
char a[10];
cin>>a; //输入“abc cbdike"
cout<<a<<endl; //结果只有前面abc进入元素中,后面因空白截流。
另一产生原因就使数组”超限“为正常了。
char a[10];
cin>>a; //输入“abalskdjflasdjfjals;dfja;sldjfa;lsdkfjaksji aksdjf"
cout<<a<<endl; //屏幕会输出“abalskdjflasdjfjals;dfja;sldjfa;lsdkfjaksji aksdjf",这个显示超出了10的限制。
-------------------------------------------------------------------------------------------------------------------------------------------------
因此,对于字符数组用字串输入进行初始化时,要把空白字符”纳入“元素,用cin.getline(text,maxlen),注意这个最大字符包含了‘\0',如5则只有前面4个字符,第5个字符是’\0'。
同前面的错误一样。
char a[3];
cin.geline(a,5); //输入"abcdefghijk"
cout<<a<<endl; //输出为"abcd" ,四个字符,第5个字符是'\0',注意仍然超数据上限,因为它遵守遇‘\0'才终止结束的原则。
同时还应注意:C++不会对数组的上下限进行检查。只有当出错时,才知道。
5、数组初始化时,最多只能省略最左边的维。
6、string包含在头文件<string>中,一般std中就含有。
string与char有显著的区别:
一、string没有结束标志'\0',char数组有明显的 ‘\0"标志;
二、string的字符是用双引号,char是用单引号。
string初始化有三种:
string a;// 这是没有初始化,表示不含任何字符,其长度为0。
一、给定值初始:
string a="abcdef";
或: string a("abcdef");
二、重复值初始:
string a(3,'c'); // 表示有3个c,即a="ccc"
三、其它值初始:
string b="abc";
string a=b; //a就是“abc”
-----------------------------------
string a(b) // 同上
------------------------------
string a(b,0,2) ;//从b字符串的索引0开始,取2个长度的字符,即a="ab"
可以直接求长度:a.length();//求字符串a的长度。
7、string输入:cin》a; 仍然按照有空白字符自动截断
string输出:cout<<a; 一串输出
cout<<a[8]; 输出索引为8的字符,注意,仍然执行“不检查上限”原则,哪怕8已经过了数组上限,也不会报错。
string运行:a=a+"abc"+"bcde"; 注意两个字符串字面量相连是会出错,最好的做法是把一个字符串变量放在最开始。
8、getline(cin,a); //取得输入流字串到字串变量a中,原型:istream& getline ( istream& is, string& str, char delim )
a.substr(index,len);//取得字串从索引开始长len的子串。原型:string substr ( size_t pos = 0, size_t n = npos ) const;
长度超出字串,取到最末,省略它也一样。如果前面索引也省略,取整个字串。
a.compare(index,len,b);//在字串a中从索引index开始,在len长度的字串中与字串b进行比较。a大于b则返回正整数,等为0,小于返回负整数。
复杂点的对应在b中的子串找:a.compare(index1,len1,b,index2,len2)
9、查找字串:find() 查找第一次出现的“字串”或“字符”。
原型:
size_t find ( const string& str, size_t pos = 0 ) const; size_t find ( const char* s, size_t pos, size_t n ) const; size_t find ( const char* s, size_t pos = 0 ) const; size_t find ( char c, size_t pos = 0 ) const;
返回值:成功,第一次出现的位置(索引),其值为unsigned int.(即size_t)
失败,返回npos,即-1。小心,此时返回的是-1,但当作size_t(即ungned int)对待,因为就为42亿左右,故,最好前面强制转换。
string a="abced";
cout<<a.find('x')<<endl; //返回42亿
cout<<(int)a.find('x')<<endl; //返回-1
10、查找字串:
find_first_of(separators,index) 从索引index开始,查找第一个在字符集合separators中任意一个字符。
string a="I love you?";
string b=" ?"; //集合为空格和问题
a.find_first_of(b,1); //从索引1开始,查找第一出现在字符集合b中的字符。答案是1,因为出现了空格
find_last_of(separators,index) 以索引index为界,从字符末尾开始倒查查第一次出现的字符集合
find_last_not_of 未没出现的索引
find_first_not_of 与find_first_of相反
--------------------
同样与9的find()想反,从字串末尾开始查找,rfind()
11、修改字串:
一、插入
a.insert(index,b)
a.insert(index,b,index2,len2)
a.insert(index,"a word",len2) //此时len从a word最开始算起
a.insert(index,Num,'?') //插入N个*
二、替换
a.replace(index1,len1,b)
a.replace(index1,len1,b,index2,len2)
a.replace(index1,len1,"a word",len2)
a.replace(index1,len1,Num,'?')
三、删除
a.erase(index,len) 删除也可用空字串进行替换达到相同效果
a.clear() 全部删除,即a成为空串
12、字串数组
唯一注意的是,字串数组每个元素相当于一个一维数组
string a[10]={"OK","are","is"}; //后面为空串
cout<<a[1][1]<<endl; //输出为第二个字串are中第2个字符r