十一国庆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命名,因为是局部的(自):我试了 ,不会出警告的
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++复习要点总结十一——多态(二)
- C++ 与“类”有关的注意事项总结(十一): 成员初始化列表(★)
- C++学习总结(十一)——类的静态函数,成员函数的默认参数,类中包含引用和常量
- 博客总结十一——C++的类
- open cv+C++错误及经验总结(十一)
- 【C++】STL常用容器总结之十一:容器小结
- C++总结笔记(十一)常见容器--map
- C++之STL的list用法总结
- 对C++基础知识的总结(主要针对笔试面试)
- [待总结]java调c++ .so
- 计算C++程序运行时间总结
- 用汇编的眼光看C++(之 总结篇)
- C++中引用的使用总结
- 标准C++中的string类的用法总结
- C++调用C#总结
- Borland C++ Builder 6.0 XML处理总结
- C/C++语言写程序时的“段错误”总结
- JVM调优总结(十一)-反思
- H.264句法和语法总结(十一)宏块层预测句法
- AE C#与C++接口调用差异总结