C++抽象编程——字符串(3)——<cctype>库在字符串中的应用
来源:互联网 发布:bluestacks mac 编辑:程序博客网 时间:2024/06/07 22:07
我们都知道,字符串是由一串字符构成的,提供一些处理单个字符的工具通常是很有用的,而不仅仅局限于处理一串字符。在<cctype>中,出口了很多用于处理字符的函数,下面的图中给出了最为常用的一些函数:
第一栏,提供的是字符类型的测试。
isalpha(ch),判断ch是否为一个字母。
isupper(ch),判断ch是否为大写。
islower(ch),判断ch是否为小写。
isdigit(ch),判断ch是否为0-9之间的数据。
ispunct(ch),判断ch的否为标点符号。
isspace(ch),判断是否为空格和其他转义字符
isprint(ch),判断是否为可打印的字符
第二栏是字符转换的函数。
toupper(ch),将ch转换为大写,当ch为数字的时候,就仍为数字。
tolower(ch),将ch转换为小写。
在<cctype>库中出口的函数,在你处理字符串中常常能产生意想不到的好处。比如下面的函数,当你的字符串为非空数字时,返回true,也就是说这代表的是一个数字,或者是一串数字:
bool isDigitString(string str) {if (str.length() == 0) return false;for (int i = 0; i < str.length(); i++) {if (!isdigit(str[i])) return false;}return true;}同样的,下面的函数,用来判断你的两个字符串s1 s2忽略大小写后是不是相等::
bool equalsIgnoreCase(string s1, string s2) {if (s1.length() != s2.length()) return false;for (int i = 0; i < s1.length(); i++) {if (tolower(s1[i]) != tolower(s2[i])) return false;}return true;}
Modifying the contents of a string
跟Java等其他语言不同。C++允许你在字符串中通过特殊的下标位置给字符串中的字符赋值,以修改字符。事实上,你可以通过一些你自己的函数来修改你的字符串,就像
我们前面的 clear erase,insert, 和replace函数这样。很多时候,我们需要在不改变原字符串的情况下,转换字符串的类型。所以,我们最好就是写一些函数,以便后面使用。
假设我们需要把一串字符串全部转化成大写的字母,在<cctype>库中,我们刚刚介绍了将一个字符转换一个大写字符的函数,叫 toupper, 还记得我们上篇博文中提到的输入重复字符的范式吗?结合一下,就可以写出下面的代码:
void toUpperCaseInPlace(string & str) {for (int i = 0; i < str.length(); i++) {str[i] = toupper(str[i]);}}这样做的思路就是把字符串的每一个字符,当做独立的字符。用<cctype>库的函数来逐个处理。当然,我们也可以通过连接范式加循环来写这个函数,就像这样
string toUpperCase(string str) {string result = "";for (int i = 0; i < str.length(); i++) {result += toupper(str[i]);}return result;}那么这两个策略有没有什么不同呢?当然有,第一种方式显然更加高效,因为第二个把字符转换为大写字符后。还要实现一个一个来拼接。尽管如此,第二种方法却能更加灵活运用,更能避免一些不可预知的错误。因为后者返回的是拼接完成后的字符串,返回的是字符串类型。现在我们将这两个函数结合一下,写出下面的函数:
string toUpperCase(string str) {toUpperCaseInPlace(str);return str;}我们要记住,在程序中,C++自动复制string的内容,因为它是默认通过值传递的。要改变它,就要用引用参数。
The legacy of C-style strings
在早期,C++之所以成功。就是因为它包含了所有的C作为它的子集。然而。在设计的决定上,也意味着C++含有了在现代面向对象中,C语言有些东西便不一定说的通。但
是尽管如此,我们依旧希望维持它们的兼容性。在C语言中,string是在程序中是被视为字符的一个低级数组,所以,它并没有提供高级的一些手段使得string类变得那么有用。这就使得C++不得不同时支持两种表达方式,所以,大多数情况下,你可以不必担心兼容性的问题,因为C++会自动转换成对应的string,就比如下面的语句:
string str = "hello, world";
C++就会自动把它转化成C风格的字符串"hello, world". 但是注意,C++并不允许这样的声明:
string str = "hello" + ", " + "world";
这里的问题是这个代码试图把+运算符应用到字符串文字,但是它们不是C ++字符串对象。当你你需要解决这个问题,你可以通过调用字符串到字符串对象显式转换一个字符串,就像这样:
string str = string("hello") + ", " + "world";
这样子,hello字符串就可以连接了。
对字符串有两个不同的表示形式产生的另一个问题是一些C ++库需要使用C风格的字符串。在这些库抽象应用程序上使用C ++字符串,你必须在某种程度上转换C ++字符串对象变成C语言的对应物。 指定转换很简单你需要做的是应用c_str方法到字符串,以获得其C语言等效的语句。但是这在理解方面无疑是增加了理解的难度。
老规矩,下一篇把完整的代码补上。
- C++抽象编程——字符串(3)——<cctype>库在字符串中的应用
- C++抽象编程——字符串(2)——<string>库的应用与字符串遍历
- C++抽象编程——字符串(3)——字符串判断与大小写转换
- C++抽象编程——回溯算法(4)——回溯在游戏中的应用
- C++抽象编程——字符串(1)——字符串运算
- C++抽象编程——字符串(2)——字符串翻转与比较
- iOS Objective—C 字符串应用
- C++抽象编程——STL实战(5)——map在数据文件查找中的应用
- C语言——例程:字符串中的子字符串替换
- 理解C、C++、Win32与COM中的字符串——字符串处理(二)
- 【C++】学习笔记二十三——字符函数库cctype
- GPS数据处理——字符串编程练习(C语言)
- C++/CLI 编程——使用 for each 循环存取字符串中的字符
- Linux下的C语言编程——字符串中的数字转int型
- C——字符串
- C++——字符串
- [C++STDlib基础]关于单字符的操作——C++标准库头文件<cctype>
- Object-C—字符串
- 函数内调用函数和递归
- 实现线程的3种方式
- C++复制构造函数、const相关总结
- 机器学习——Logisitc回归
- Mysql知识储备
- C++抽象编程——字符串(3)——<cctype>库在字符串中的应用
- Android MVC MVP MVVM 模式
- jvm动态代理原理
- leetcode141. Linked List Cycle
- iOS沙盒目录结构解析
- 设计模式(15)-策略模式
- 线程的消息机制
- stm32低功耗模式总结
- 【Android 性能优化】—— 详解内存优化的来龙去脉