C++学习笔记(重温计划之四)

3、数据类型(中)

 1)C-串与string

   c++的字符串分两类,一种是由c语言沿袭而来,称为c-串。例如,

   char buffer[7]=“Hello!”; //由于所有字符串必须以\0为结束符,则长度定义必须比实际元素个数多1

   事实上,字符数组的实际类型为char,或const char,称为字符型指针。实际应用中我们做如下定义:

   char str=“Hello!”;//输出str时为”H”,str则为”Hello”

   在c库函数中,又定义了字符串操作函数,例如strcmp(比较)、strcpy(复制)、strcat(连接)、strrev(倒置)、strset(设置)、strstr/strchr(查找串或字符)。通常我们需要指定头文件string.h,标准c++将其嵌套入iostream中,即省略了这一调用。

  其实,C++中提供了另一种高效可行的字符串类型,即string类型。string类是标准c++中的基础类,这在后文中我们会有详细解释。string的目的是使字符串操作更加方便安全。

include”iostream”

include”algorithm”

using namespace std;

int main(){

   string a,s1 = “Hello!”;

   string s2 = “123”;

   a=s1;                                                                                    //复制

   cout << (a==s1 ? “ ” : “not”) << “equal\n”;                          //比较

   cout << a+s2 <<endl;                                                         //连接

   reverse(a.begin(),a.end());                                                     //倒置串

   cout <<a << endl;

   cout << a.replace(0,9,9,‘c’)<<endl;                                     //设置

   cout << (s1.find(“ell”)!= -1 ? “” : “not”) << “found\n”;        //查找串

   cout << (s1.find(‘c’)!= -1 ? “” : “not”) << “found\n”);          //查找字符

}

   由上基本可以看出,string在与c-串对比中是明显有优势的。而且,c-串可以随时赋值给string变量,具有相当的亲和程度.

  现在讨论string与c-串在输入输出中的c++用法.

   当输入时,我们以:

   fot(string s;cin >> s;)            //string s可以替换为char s[10]

   cout << s <<“ ”;

   cout << endl; 

   cin >>在读入时一般过滤前导空格,包括空格、回车、水平/垂直制表符等等。

  我们同样可以采用非循环的方式。例如:

   string s;                           //在字符数组中,可以定义char s[10]

   getline(cin,s);                   //相应可以改为cin.getline(s,10)

   cout << s <<endl;           //getline的好处是,在读入多行字符时,程序可以将内容逐行分解操作

  下面假设,存在一个文件aaa.txt,文件内有若干行整数,并且每行整数个数未知。这时求每行的整数和。

include<iostream>                      //该程序已调试通过

include<sstream>

include<fstream>

using namespace std; int main(void){  ifstream in(“aaa.txt”);  for(string s;getline(in,s);){              //逐行读入的循环   int a, sum = 0;   for(istringstream sin(s);sin>>a;sum+=a);          //istringstream sin(s)意在创建输入string流sin(),sin>>即从string流中将整数输入到a中进行运算   cout << sum << endl;  }  getchar();  return 0; }

  上面的程序体现了string流的概念,进一步体现了string字符串型的优势和特点。

  2)数组

   int a[5];   //即定义了一个数组,5代表了数组中元素个数。并且[ ]内必须为常量表达式,通常我们可以使用const int定义。

   数组的初始化过程中,有如下几种方式进行:

   int iArray[10] = {1,2,3,4,5,6,7,8,9,10};

   请注意,以上方式禁止的有:元素个数大于定义数、中途有元素定义为空、元素省略…不过实际操作中可以使元素个数少于定义数,比如  int iArray[10] = {1,2,3,4,5,6,7,8}; 这是允许的。

 int iArray[] = {1,2,3,4,5,6,7,8,9,10};  //虽然没有定义常量值,但初始化值的个数已经做出说明了。

 我们还能用到sizeof(a[n])来返回a[n]元素所占空间的字节数。

 下面来探测未初始化数组元素的默认值情况。计算机把这一类数组区分为全局数组或静态数组、局部数组。在全局数组和静态数组中,未定义情况下的元素值恒为0,而在局部数组中则变成不确定数。

 数组也有多位数组的形式,可定义为:

   int a[3][5];   //这是一个2维数组,其输入输出方式和1维数组是相同的