十一国庆C++小总结

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命名,因为是局部的(自):我试了 ,不会出警告的

你可能感兴趣的:(十一国庆C++小总结)