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语言等效的语句。但是这在理解方面无疑是增加了理解的难度。

老规矩,下一篇把完整的代码补上。


0 0
原创粉丝点击