C风格字符串
c风格的字符串:存放在字符数组中,以'\0'结束;而c++主要以string类代替!对大多数应用来说,使用标准库string要比使用c风格字符串更安全,更高效。
举例:
string str = "123";//C++风格 char str[4]="123";//C风格
c风格字符串的函数:
char p[20],p1[20],p2[20]; strlen(p);//返回p的长度,空字符不计算在内! strcmp(p1,p2);//比较p1和p2的相等性,如果p1==p2,返回0;如果p1<p2,返回一个负值,如果p1>p2,返回一个正值; strcat(p1,p2);//将p2附加到p1之后,返回p1; strcpy(p1,p2);//将p2拷贝给p1,返回p1;
对于函数strlen(p),计算字符串的长度,其中p是指针。strlen()要计算字符串长度,必须知道哪里是结尾,因此使用'\0'表示结尾。传入此类函数的指针必须指向以空字符作为结束的数组:
char ca[]={'C','+','+'};//不以空字符结束! cout<<strlen(ca)<<endl;//严重错误:ca没有以空字符结束,strlen函数可能沿着ca在内存中的位置不断向前寻找,直到遇到空字符才停下来。
char a1[] = "abc", 等价于char a1[] = {'a','b','c','\0',}; strlen(a1)等于3,长度不包括'\0',假如这样写 char a1[] = {'a','b','c',}; strlen(a1)是多少? 答案不确定,因为strlen一直找到'\0'才认为是结尾。
在C风格字符串中,不能像string类中那样用>、<来比较两个字符串,如果把这些运算符用在两个c风格字符串上,实际比较的是两个指针而非字符串本身,将产生一个错误。同样地,使用+号也类似,应该使用strcat()。
标准库类型string
string表示可变长的字符序列,使用string类型必须首先包含string头文件。string定义在命名空间std中。
1、初始化
string s1;//默认初始化,s1是一个空串 string s2(s1);//s2是s1的副本 string s2=s1;//等价于s2(s1),s2是s1的副本 string s3("value");//s3是字面值“value”的副本,除了字面值最后的那个空字符外!!! string s3="value";//等价于s3("value"),s3是字面值“value”的副本 string s4(n,'c');//把s4初始化为由连续n个字符c组成的串!
2、string对象上的操作
os<<s;//将s写到 输出流os当中,返回os is>>s;//从is中读取字符串赋给s,字符串以空白分隔,返回is getline(is,s);//从is中读取一行给s,返回is s.empty();//s为空返回true,否则返回false s.size();//返回s中字符的个数;返回类型size_type,是一种无符号类型的值 s[n];//返回s中第n个字符的引用,位置n从0计起 s1+s2;//返回s1和s2连接后的结果 s1=s2;//用s2的副本代替s1中原来的字符 s1==s2;//相等判断 s1!=s2;//不等判断 <,<=,>,>=//利用字符在字典中的次序进行比较,且对字母大小写敏感
在string中执行读取操作(cin>>str)时,string对象会自动忽略开头的空白(即空格符、换行符、制表符等)并从第一个真正的字符开始读起,直到遇见下一处空白为止。例如输入时“ hello world ”,输出将是”hello“。如果我们希望在最终得到的字符串中保留输入时的空白,这时应该用getline函数来代替原来的>>运算!
两个string对象相加的问题,两个string对象可以使用+连接成一个新的string对象,这里要注意:当把string对象和字符字面值及字符串字面值混在一条语句中使用时,必须确保每个加法运算符(+)的两侧的运算对象至少有一个是string:
string s1="hello",s2="world"; string s3=s1+","+s2+'\n';//正确,输出为hello,world string s4="hello"+“,”;//错误,两个运算对象都不是string
访问string对象中的每一个字符,还可以使用下标运算符,下标从0计起,小于s.size()。使用超出此范围的下标将引发不可预知的结果。
来源:https://www.cnblogs.com/duanpengcheng/p/4528867.html