最近准备从头弄遍C++,以前太浮躁,看的书很多,就是没沉下心去仔细学习,所以现在决定了一项一项的解决问题。先拿c++开刀吧。
4.1 数组
注意要点
1. 申明通用格式:
typeName arrayName[arraySize]
arraySize必须是在编译时就是已知的值。
2. sizeof:
Sizeof操作符返回类型或数据对象的长度,用于数组元素,则得到的是整个数组中的字节数。
3. 编号:
从0开始编号,例如:Months[0]是Months数组的第一个元素。
最后一个元素的索引比数组长度小1。
4. 数组的初始化
即初始化时可以赋值,否则只能单个的给数组元素赋值。
int cards[4] = {3,6,8,10}; //okay
int hand[4]; //okay
hand[4] = {3,6,8,10}; //not allowed
hand = cards; // not allowed
5. 若只对数组的一部分初始化,则编译器将把其他元素设置为0
如:
long totals[500] = {0};
6. 初始化时数组[]为空,则编译器将计算元素个数。
eg.
short things[] = {1, 5, 3, 8};
int num_elements = sizeof things /sizeof(int);
4.2 字符串
C++处理字符串的方式有两种。第一种来自c语言,称为C-风格字符串。另外一种是基于string类库的方法。
注意要点
1. C-风格字符串特殊的一种性质:以空字符结尾,空字符被写做\0,其ASCII码为0,用来标记字符串的结尾。
如char dog[5] = {'a','b','c','d','\0'}; //C-风格字符串
char cat[5] = {'a','b','c','d','e'}; //non-C-风格字符串
C++很多处理字符串的函数,包括cout的那些函数,都是逐个处理字符串中的字符,直到到达空字符为止。若处理dog这样的字符串,则输出abcd,遇到’\0’,停止。但处理cat的话,则不停止,而是继续,知道遇到这个内存地址后面的首个空字符为止。
2.用上面的示例初始化一个字符串很麻烦,而可以用字符串常量(如“abcde”)来初始化。
eg.
char bird[10] = “Mr. Cheeps”; //the \0 is understood
char fish[] = “Bubbles”; //let the compiler cout
用””括起来的字符串隐式的包括结尾的空字符,空字符也在数组中占据了一个字节的字符空间。也可让编译器自动计算大小,而不用给出数组具体值。
3.双引号“”,如“abcde”表示的是字符串所在的内存地址。
4.sizeof操作符指出整个数组的长度(字节),而strlen()函数返回的是存储在数组中的字符串的长度,而不是数组本身的长度。
Eg.
Const int size = 15;
Char name[size] = “C++owboy”;
Cout<<strlen(name)<<endl; //8,共有字符8个
Cout<<sizeof (name)<<endl; //15,大小15个bytes
5.字符串的输入
const int size = 15;
char name1[size];
char name2[size];
cin>>name1;
cin>>name2;
cout<<name1<<endl;
cout<<name2<<endl;
若输入 abcdef 123456然后回车换行,则程序直接运行,输出abcdef 123456,因为cin是使用空白(空格、制表符和换行符)来定字符串的界。所以它获取了一个单词后,就直接把它放到数组中,并在结尾处添加空字符。若要输入new york到一个数组,那么怎么办?可以用cin.get()或者cin.getline();这两个输入时面向一行的。
7. cin.getline()
有两个参数,第一个是数组名(OUT),第二个是读取字符数。这个成员函数读取并丢弃换行符。
Eg.
Cin.getline(name,20);//这行包含的字符不超过19个,因为最后一个留给空字符。
这样就可以输入一行,而不用管到底有多少空格,只要字符数小于第二个参数。
8. Cin.get()
而get()这个成员函数,参数同上,但是get不再读取并丢弃换行符,而将其留在输入队列中。
const int size = 15;
char name1[size];
char name2[size];
cin.get(name1,15);
cin.get(name2,15);
这个主要是输入一个123 123后回车,name2却没有内容,因为换行符还在输入队列中。
可以再调用一个cin.get(),跨过该输入字符,也由于cin.get(name1,15)返回的是一个cin对象,所以可以这样写cin.get(name1,15).get().
9.
int year;
char name1[size];
char name2[size];
cin>>year;
cin.get(name1,15);
cin.get(name2,15);
输入年份后,就直接跳过后面的输入了,原因是输入数字后,换行还保留在输入队列中,因而需要调用个cin.get()等跨过该输入字符。
posted on 2010-05-24 22:14
batstying 阅读(163)
评论(0) 编辑 收藏 引用 所属分类:
C++ Primer plus学习