前面一篇博客里介绍了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。