在C++中,有两种字符串,一种是从C沿袭过来的,称为C—字符串,简称C—串;另一种是string。
C—串为用双引号括起来的,以一个全0位(整数0)字节作为结束符的字符序列。
C—串的空间长度为字符串长度加1。
C—串的类型为char*(const char*)(字符指针),表示C—串的起始地址。
(输出字符指针就是输出C—串,所以输出时从起始地址开始,直到遇到0为止)
#include<iostream>
using namespace std;
int main()
{
char* str1="Hello!";
char str2[7]="Hello!";
char str3[7]={'H','e','l','l','o','!','\0'};
int a[5]={0,1,2,3,4};
cout<<str1<<endl<<str2<<endl<<str3<<endl; //都为 Hello!
cout<<*str1<<*str2<<*str3<<endl; //都为 H
cout<<&str1<<" "<<a<<endl; //0012FF5C 0012FF20
return 0;
}
C-串库函数:
strcpy(string copy)
函数声明:
char* strcpy(char* x1,char* x2)
函数说明:
用x2的内容覆盖x1。由于x2字串的长度可能比x1字串空间要长,所以strcpy的使用并不安全。
strcmp(string compare)
函数声明:
int strcmp(char* x1,char* x2)
函数说明:
该函数表示将x1串与x2串进行字典序比较。如果x1小,则返回值为负数;如果x1大,则返回非0正数;如果两者相等,则返回0。
strcat(string concat)
函数声明:
char* strcat(char* x1,char* x2)
函数说明:
该函数将x2字串的内容接在x1字串之后,或者说将x2字串拷贝到x1字串结束处。显然,该调用会引起x1字串加长,或者说,结束符0的位置移后。在x1字串之后所余自身空间不足以接纳x2字串时,调用操作将不安全。
strrev(string reverse)
函数声明:
char* strrev(char* x)
函数说明:
该函数将x字串倒过来,并改变原来的存储,同时直接将结果字串返回。
strset(string set)
函数声明:
char* strset(char* x,char b)
函数说明:
该函数是将x整个字串的每个字符都用b字符来取代,并将x作为结果返回。
strstr(string substring)
函数声明:
int strstr(char* x,char* s)
函数说明:
该函数是在x字串中查找s字串。若找到,则返回整数1,否则返回整数0。
strchr(string char)
函数声明:
int strchr(char* x,char b)
函数说明:
该函数在x字串中查找b字符。若找到,则返回整数1,否则返回整数0。
#include<iostream>
using namespace std;
int main()
{
char* s1="ABC";
char* s2="DEF";
char a[10];
strcpy(a,s1); //复制
cout<<(strcmp(a,s1)==0?"":"not ")<<"equal"<<endl; //比较
cout<<strcat(a,s2)<<endl; //连接
cout<<strrev(a)<<endl; //倒置
cout<<strset(a,'c')<<endl; //设置
cout<<(strstr(s1,"BC")?"":"not ")<<"found"<<endl; //查找字串
cout<<(strchr(s1,'c')?"":"not ")<<"found"<<endl; //查找字符
return 0;
}
//运行结果:
//equal
//ABCDEF
//FEDCBA
//cccccc
//found
//not found
C-串的输入输出:
#include<iostream>
using namespace std;
int main()
{
for(char a[20];cin>>a;) //输入 AB CD EF
cout<<a<<endl;
return 0;
}
//运行结果:
//AB
//CD
//EF
cin>>的读入方式总是将前导的空格(所谓空格,即包括空格、回车、水平或垂直制表符等)滤掉,将单词读入,当遇到空格时结束本次输入。
//也可以通过getline将其一次性地输入:
#include<iostream>
using namespace std;
int main()
{
char a[20];
cin.getline(a,20); //输入 AB CD EF
cout<<a<<endl;
return 0;
}
//运行结果:
//AB CD EF
//也可以通过getline将其一次性地输入:
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str;
getline(cin,str); //输入 AB CD EF
cout<<str<<endl;
return 0;
}
//运行结果:
//AB CD EF
getline总是将行末的回车符滤掉。
//逐个字符读入:
for(char c;(c=cin.get())!='\n';)
cout<<c;
cout<<endl;
//string流
//计算文件a.txt中每行所有整数之和
#include<iostream>
#include<string>
#include<sstream>
#include<fstream>
using namespace std;
int main()
{
ifstream fin("a.txt");
for(string str;getline(fin,str);)
{
int temp=0,sum=0;
for(istringstream sin(str);sin>>temp;)
sum+=temp;
cout<<sum<<endl;
}
}
istringstream是输入string流,在sstream资源中说明。其创建sin流(名字可任意取)时,参数为string对象。
其将string的实体看作是一个输入流,因而,sin>>temp即是从string流中输入整数到temp中。
char*类型和string类型之间的转换:
一、char*类型转换为string类型:
char* c="abcd";
string str=c;
或者
char c[]="abcd";
string str=c;
二、string类型转换为char*类型:
string str="abcd";
const char* c=str.c_str(); //c_str()是把string转换成const char*