您的位置:首页 > 编程语言 > C语言/C++

十一国庆C++小总结

2012-11-12 11:26 267 查看
1.从字符串中查找字符:

char *strchr(const char *s,int c);

说明:该函数从s所指字符串中的第一个字符起顺序查找ASCII码为c值的字符,若查找成功则返回该字符的存储地址,否则返回NULL(即数值0)。

当调用该函数时传送给第二个形参c的实参,可以为整数,但通常是一个待查找的字符。

例:strchr("abcd",'c')   则返回"cd"  

    strchr("abcdefg",'c') 则返回 "cdefg"

2.从字符串中逆序查找字符:

char *strrchr(const char *s,int c);

说明:它与上面介绍的strchr函数功能相同,都是从字符串中查找字符,但查找次序不同,该函数是从s所指字符串的最后一个字符起顺序向前查找,同样若查找成功返回字符的存储地址,否则返回NULL。

例:strchr("abcdce",'c')  则返回"cdce"

若是strrchr("abcdce",'c') 则返回"ce"

注意:经自己测试,调用两个函数后,原串的值都并未改变,仍为"abcdce"

3.从字符串中查找子串

char *strstr(const char *s1,const char *s2);

说明:该函数从第一个参数s1所指字符串中第一个字符起,顺序向后查找出与第二个参数s2所指字符串相同的子串,若查找成功则返回该子串的首地址,否则返回NULL。

例:strstr("abcdce","cd")  则返回"cdce"

4.有时希望逆序遍历容器中的元素。如果容器有双向迭代器,可能会写出以下代码:

vector<int>::iterator p;

for(p = container.end(); p != container.begin(); p--)
cout << *p << endl;

上述代码能够成功通过编译,在某些系统上也确实能获得你想要的结果。(注:在我的机子上测试,可通过编译,且也是逆序的,但第一个元素没有打印出来)

幸好有一个很简单的办法能满足要求。对于有双向迭代器的容器,可用所谓的逆向迭代器(reverse iterator)返转一切。以下代码能很好地工作:

vector<int>::reverse_iterator rp;

for(rp = container.rbegin(); rp != container.rend(); rp++)
cout << *rp << endl;

5.最好把基类的析构函数声明为虚函数。这将使所有派生类的析构函数自动成为虚函数。(构造函数不能声明为虚函数。这是因为在执行构造函数时类对象未完成建立过程,当然谈不上与类对象的绑定)

6.在c语言中,对应于一个字符串指针,若要输出字符串本身还是指针,我们可以直接按不同的格式即可实现不同的输出。如("%p") 或者 ("%s")

而在c++中,如果我们直接 cout << s<< endl; 则输出的是字符串本身,若要输出指针地址,我们可强制类型转换成 void * ,即 cout << (void *)s << endl;

例:

char * s = "chenyong";

cout << s << endl;     ---->将输出 chenyong

cout << (void *) s << endl; ---->可输出指针地址

7.cout << "hello world" << endl;--->将输出 hello world

  cout << cout << endl;         --->将输出cout 的地址

  cout << "hello world" << cout << "ni hao";  --->将输出hello world +cout地址 + ni hao

  cout << "hello world" << "ni hao" ; --->将输出 hello world ni hao

8.除了各种operator<<()函数外,ostream类还提供了put()方法和write()方法,前者用于显示字符,后者用于显示字符串。例:

cout.put('W');  --->显示字符W   (现在c++支持直接 cout << 'W' 来输出字符。

write()的第一个参数提供了要显示的字符串的地址,第二个参数指出要显示多少个字符 例:

const char *state = "Kansas";

for(int i = 0; i <= strlen(state); i++)
cout.write(state,i) <<endl;

将输出

K

Ka

Kan

Kans

Kansa

Kansas

9.关于cout缓冲区:

cout << "Enter a number: ";

while(1);

则上式的字符串将不会输出到屏幕上,这涉及到缓冲区的知识:

由于ostream类对cout对象处理的输出进行缓冲,所以输出不会立即发送到目标地址,而是被存储在缓冲区中,直到缓冲区满。然后,程序将刷新(flush)缓冲区,把内容发送出去,并清空缓冲区,以存储新的数据。通常,缓冲区为 512 字节或其整数倍。当标准输出连接的是硬盘上的文件时,缓冲可以节省大量的时间。然而,对于屏幕输出来说,首先缓冲区的重要性要低得多,故有几种方法可刷新缓冲区,例如将换行符发送到缓冲区后,将刷新缓冲区。还有:

cout << "Enter a number: ";

float num;

cin >> num;

程序期待输入这一事实,将导致它立刻显示cout消息,即使输出字符串中没有换行符(注意和上一例子区分)

有两个函数可实现强制刷新:flush和endl。控制符flush刷新缓冲区,而控制符endl刷新缓冲区,并插入一个换行符。

事实上,控制符也是函数,例如可以直接调用flush()来刷新缓冲区:

flush(cout);  或者 cout << flush;

10.在同一个程序中,可以同时出现多个这样的形式:

for(int i = 0; i < N; i++){}

for(int i = 0; i < M ; i++) {} ---即:均可以同一个名字i命名,因为是局部的(自):我试了 ,不会出警告的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: