160 likes | 303 Views
第八章 字符串和向量. 8.1 字符串的一种数组 类型 8.2 标准 string 类 8.3 向 量 小结与作业. 8.1 字符串的一种数组类型. C++ 提供两种字符串形式,一种就是以 '' 作结束标志的字符数组,称为 C 字符串 ;另一种是 string 类,是使用更方便的标准字符串。 1. 空字符 '' 注意与空格字符 ' ' 的区别,空字符是 C 字符串在字符数组中保存的一个特殊的符号,没有这个符号的字符数组,就不是 C 字符串,而只能是一个字符数组。. cs[0]. ‘ a’. cs[1]. ‘ b’. cs[2].
E N D
第八章 字符串和向量 • 8.1 字符串的一种数组类型 • 8.2 标准string类 • 8.3 向 量 • 小结与作业
8.1 字符串的一种数组类型 • C++提供两种字符串形式,一种就是以'\0'作结束标志的字符数组,称为C字符串;另一种是string类,是使用更方便的标准字符串。 • 1.空字符'\0' • 注意与空格字符' '的区别,空字符是C字符串在字符数组中保存的一个特殊的符号,没有这个符号的字符数组,就不是C字符串,而只能是一个字符数组。
cs[0] ‘a’ cs[1] ‘b’ cs[2] ‘c’ cs[3] ‘d’ cs[4] ‘\0’ 2.C字符串的定义与初始化 a • 定义一个能保存4个字符的C字符串cs如下: • char cs[5]; • 要给cs赋值为“abcd",可使用以下方法: • strcpy(cs,"abcd"); • 或是在定义的同时赋值: • char cs[5]="abcd"; cs
4、C字符串输入和输出 • (1)使用cout输出、 cin输入 • char a[80],b[80]; • cin>>a>>b; • cout<<a<<b<<"END OF OUTPUT\n"; • 演示上述程序段,讨论输入字符串含有空格会怎么样? 结论:cin不能接受带有空格的字符串,空格实际上是输入字符串的分界符!
(2)使用流成员函数getline输入 • 使用流成员函数getline可以一次接受一行字符串,直至换行符,特别是可以接受带空格的字符串。 • 格式为:getline(C字符串变量,n) • 其中参数n决定最多接收字符个数 • 示例: • char a[80],ss[5]; • cin.getline(a,79); • cout<<“a字符串:”<<a<<endl; • cin.getline(ss,4); • cout<<“ss字符串:”<<ss<<endl;
5.C字符串应用示例——数字字符串转换数值 • 由数字字符构成的字符串,如“1234”,与数字1234(一千二百三十四)明显不一样,但在使用计算机中很容易混淆,编程处理前者到后者的转换问题。其实C++的cstdlib库中提供有atoi(数字字串)函数,他可以把数字字串转化为数值。 • 例8.1 • 输入一个字串,将其中的非数字字符剔除,其余的数字字符转化为数值。 • 此问题可分为两部分: • 一是接收字符串,并且屏蔽非数字字符,保存在一个字符串中; • 二是将数字字串转换成整数数值。
任务一:接受数字字符串 • void read_and_clean(int&n) • { • const int ARRAY_SIZE=6; char digit_string[ARRAY_SIZE]; • char next; • cin.get(next); int index=0; • while(next!='\n') • { • if(isdigit(next)&&(index<ARRAY_SIZE-1)) • { digit_string[index]=next; index++; } • cin.get(next); • } • digit_string[index]='\0'; • n=atoi(digit_string); • }
任务二:将数字字串转换成整数 • 使用库函数atoi(char cs[]) • 也可以自编函数atoi1(char cs[])如下: • int atoi1(char ds[]) • { • int i,n,s=0; • n=strlen(ds); • for(i=0;i<n;i++) • { s=10*s+ds[i]-48; } • return s; • } 调试程序,注意:中文输入,非数字字符出现的位置变化
8.2 标准string类 • string类型是ISOC++标准规定的类,就像int、char、float一样使用。注意,头文件包含<string> • 1.连接、赋值的运算符号化 • string字符串可以直接使用“=”赋值,直接使用“+”连接。例:
string类的成员函数及运算符 • 假定定义:string str,str1,str2;int pos,len; • 则有以下函数可以使用: • (1)取子字符串:str.substr(pos,len) • (2)求串长: str.length() • (3)判串空: str.empty() • (4)插入子串: str.insert(pos,str2) • (5)删除字串: str.remove(pos,len) • (6)查找字串: str.find(str1) • (7)定位查找字串: str.find(str1,pos) • (8)定位查找串中字符:str.find_first_of(str1,pos) • (9)查找不属于: str.find_first_not_of(str1,pos) • (10)赋值、连接、比较等运算符号化: • =、+、==、<、>、<=、>=、!=
C字符串与string字符串的关系 • C++认定string类为标准字符串,并且为其提供了丰富的成员函数,一般来说,C++程序员青睐string类字符串,C字符串是为C语言保留的,若要将string字符串转换成C字符串,可使用string的成员函数: • c_str() • 如有定义:string str; • 则:str.c_str()就是将string字符串转换成的C字符串。
编程实例:回文测试 • 所谓回文就是顺读倒读一样的字符串,如“abcba”、“abccba”等,某些中文回文对联更使人拍案叫绝: • “上海自来水来自海上”、“北京输油管油输京北” • “雾锁山头山锁雾”、“天连水尾水连天”、 • “香山碧云寺云碧山香”、“ 黄山落叶松叶落山黄” • 给出一个字符串,编写程序判断其是否为回文,可使用如下算法: • (1) 输入一个字符串; • (2)求出其长度,找出其对折中心位置; • (3)让i从0开始循环到中心位置,依次比较第i个字符与其对折对应的字符是否相同,有不相同的就不是回文,退出循环;循环结束,全相同,就是回文。
程序核心代码 • int i,len,mid; bool yesno=true; string str,str1; • cout<<"请输入一个英文字符串:\n"; getline(cin,str); • str1=remove_punct(str); • len=str1.length(); mid=len/2; • for(i=0;i<=mid;i++) • { if(tolower(str1[i])!=tolower(str1[len-1-i])) • {yesno=false;break;} } • if(yesno) • cout<<"字符串\""<<str<<"\"是一个回文。\n"; • else • cout<<"字符串\""<<str<<"\"不是一个回文。\n";
8.3 向量 • 1.向量与数组的关系 • 用途一样,只是向量的长度在程序运行时可以改变。 • 2.向量定义 • vector <int> v;就定义了一个一整数为元素的向量v • 3.向量初始化 • 新定义的向量一般是个空向量,不能像数组一样直接使用其元素v[i],必须使用成员函数push_back()添加元素并赋初值,如给上述定义的v添加3个元素并赋值: • v.push_back(0); • v.push_bcak(1); • v.push_bcak(2);
向量示例 • #include<iostream> • #include<vector> • using namespace std; • main() • { vector<int>v; • cout<<"请输入一个正数序列,以负数作结束标志:\n"; • int next;cin>>next; • while(next>0) • { v.push_back(next);cout<<next<<"加入"; • cout<<"向量长度为:"<<v.size()<<endl; • cin>>next;} • cout<<"你输入的序列为:\n"; • for(int i=0;i<v.size();i++)cout<<v[i]<<" "; • cout<<endl;system("pause");}
小结与作业 • 字符串是十分重要的数据组合形式 • 两种类型:C字符串、string字符串 • 注意两种类型的字符串的使用方法的区别 • 向量与数组类似,但它是动态的 • 作业:P331,编程项目4、12