C++学习笔记(八):对字符的操作函数和范围for语句的使用

    前面一篇博客里介绍了string类和其详细使用,这里再说一下对单个字符的操作可以有哪些方法。

isalnum(c) c是字母或数字时为真
isalpha(c) c是字母时为真
iscntrl(c) c是控制字符时为真
isdigit(c) c是数字时为真
isgraph(c) c除空格之外的打印字符时为真
islower(c) c是小写 字母时为真
isprint(c) c是可打印字符(包括空格)时为真
ispunct(c) c是标点符号时为真
isspace(c) c是标准空白字符(空格、进纸、换行符、回车

、水平制表符或者垂直制表符)时为真

isupper(c) c是大写字母时为真
isxdigit(c) c是十六进制数(0~9,a~f,A~F)时为真
tolower(c) 将c变为小写字母
toupper(c) 将c变为大写字母

       从上表可以看出对于单个字符的判断及操作十分的全面,基本上是够我们做开发了。

       但是如果我想对string中的某个字符进行判断或操作该怎么办呢?比如检查某个string中是否含有空白,比如把其中的某个字母大小写转换等等。遇到此类问题,基本上用循环语句再加上逻辑判断语句是可以解决的,但是写出的代码会发现比较繁琐。因此,如果有更好的更简便的方法,那我们何乐而不为呢?下面就说下C++11标准新规定的一种基于范围的for语句:范围for语句。

       其语法表达形式如下:for(declaration  :  expression)

                                                      statement

       其中expression是一个对象,用于表示一个序列。declaration是定义一个变量,该变量将被用于访问序列中的基础元素。每次迭代,declaration的变量会被初始化为expression的下一个元素值

        用法举例如下:

int main(void)
{
    string s = "hello";
    for(auto c : s)
         cout <<  c <<endl;
    return 0;
}

      程序里通过auto来让编译器决定c的类型(关于auto在前面的博客里有介绍),这里c的类型是char。每次迭代,s的下一个字符都会被拷贝给c。最后程序输出结果为

h

e

l

l

o

这是用范围for语句来实现每个字符的逐次输出,那如果想将每个字符都变成大写,在按字符串的形式输出呢?

实现方法如下:

<span style="font-size:18px;">int main()
{
       string s("hello");
       for(auto &c : s)
          c = toupper(c);
       cout << s<<endl;
       return 0;
}</span>

程序运行结果如下:

HELLO

       这里定义的C是引用类型的(关于引用前面的博客有介绍),且引用的是s的下一个字符,故每次给c赋值,就相当于给s相对应的位置赋值。此处的c必须要是引用类型。如果不是,那么整个c = toupper(c)操作只能使c这个变量里的值由小写变成大写,根本上却没有改变原字符串的内容,因为c和s是独立的,只是c的值是有s赋予的而已。而用了引用,则相当于将c和s绑定了起来,那么对c的所有操作将会映射给s。

你可能感兴趣的:(C++,String,C++11)