现在的位置: 首页 > 综合 > 正文

(六)人以群分物以类聚:数组及字串

2012年12月19日 ⁄ 综合 ⁄ 共 3997字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.