——南昌理工学院ACM集训队
Cctype头文件中的函数
使用以下函数需要添加头文件
isalnum(c) 当c是字母或数字时为真
isalpha(c) 当c是字母时为真
iscntrl(c) 当c 是控制字符时为真
isdigit(c) 当c是数字时为真
isgraph(c) 当c不是空格但可打印时为真
islower(c) 当c是小写字时为真
isprint(c) 当c是可打印字符时为真(即c是空格或c具有可是形式)
ispunct(c) 当c是标点符号时为真(即c不是控制字符、数字、字母、可打印空白中的一种)
isspace(c) 当c是空白时为真(即c是空格、横向制表符、纵向制表符、回车符、换行符、进纸符中的一种)
isupper(c) 当c是大写字母时候为真
isxdigit(c) 当c是十六进制数为真
tolower(c) 如果c是大写字母,输出对应的小写字母;否则原样输出c
toupper(c) 如果c是小写字母,输出对应大写字母;否则原样输出c
处理每个字符?使用基于范围的for语句
string str(“some string”)
for(auto c;str) //对于str字符串中的每个字符
cout<<c<<endl; //输出当前字符
使用ccyupe头文件中包含的ispunct函数来统计string对象中标点符号的个数
string s(“hello world!!!”);
decltype(s.size())punct_cnt=0;//统计s中标点符号的个数
for(auto c:s)
{
if(ispunct(c))
{
++punct_cnt;
}
}
cout<<punct_cnt<<”punctuation characters in”<<s<<endl;
在这里插入代码片
使用toupper函数来改变字符串中的字符(对换大小写)
{
int main()
{ string s("HEllo");
for (auto& a : s) //对于s中的每个字符 (auto为一种类型,int,double)
{
a = toupper(a); //c是一个引用,因此赋值语句将改变s中字符的值
}
cout << s << endl;
}
输出结果:HELLO
特注:每次迭代时,变量c引用string对象s的下一个字符,赋值给c也就是在改变s中对应字符的值。因此在执行a=toupper(a)时,,实际上改变了c绑定字符的值。整个循环结束后,str中的所有字符都变成了大写
如何只处理一部分字符
两种方式:
1.运用下标运算符([])接收的是std::size_type类型的值(无符号数),整个参数表示访问的字符的位置;返回值是该位置上字符的引用
string对象的下标从0计起,s[0]是第一个字符,s[2]是第二个字符,s[s.size()-1]是最后一个字符
使用超出范围的下标将引发不可预知的结果(溢出),以此推断,使用下标范文空string也会引发不可预知的后果
在访问指定字符前记得一定要检查字符串是否为空
将字符串的首字符改写成大写形式
{
int main()
{
string s="hello";
if (!s.empty())
{
s[0] = toupper(s[0]);
}
cout << "s[0]="<<s[0]<<" "<<s;
}
结果:s[0]=H Hello