一直对这个问题有疑问,今天总结一下:
1、#include “string.h” 和#include <cstring> 中的字符串本质上都是C语言的字符串,及由‘\0’结尾的字符串数组。#include <cstring>是C++对C库的封装,使他看起来更加符合C++的风格。使用这个字符串的形式类似于:char[]什么什么的,是字符数组。我们可以用
2、#include<string>是名符其实的C++字符串,它是一个类,这个当然是我们编写C++程序所推荐使用的头文件。
3、#include<CString>是MFC中用的字符串类
还有一点需要说明,我们程序中用的字符串常量,为了与C程序兼容,它是C字符串。
---------------------------------------------------------------------------------------------------------------------------------------------------------
1、C中的字符串
1.1 实现
1.2 相关库函数
C标准库中对C字符串的操作:
1.2.1 stdlib.h :C标准库中的一个大杂烩库
将字符串转换成浮点数 | |
将字符串转换成整数 | |
将字符串转换成长整型数 |
将字符串转换成浮点数 |
将字符串转换成长整型数 |
将字符串转换成无符号长整型数 |
1.2.2 ctype.h :这个主要是C标准库中字符处理的库,暂且把它也搁在这吧。它传入的参数一般熟int型的。
当字母或数字字符时, 返回真值 |
当字母字符时, 返回真值 |
当控制字符时, 返回真值 |
当数字字符时, 返回真值 |
当非空格可打印字符时, 返回真值 |
当小写字母字符时, 返回真值 | |
当可打印字符时, 返回真值 | |
当标点字符时, 返回真值 | |
当空格字符时, 返回真值 | |
当大写字母字符时, 返回真值 | |
当十六进制字符时, 返回真值 |
将字符转换成小写字符 | |
将字符转换成大写字符 |
1.2.3 string.h:
C语言里面关于字符数组的函数定义的头文件,常用函数有strlen、strcmp、strcpy等等,更详细的可以到include文件夹里面查看该文件。
和C++的cstring对应,是c版本的头文件,包含比如strcpy之类的字符串处理函数
cstring是C++对C语言中的strcpy之类的函数申明,包含cstring之后,就可以在程序中使用C语言风格的strcpy之类的函数。
即:#include <iostream>和#include "string.h"是相同的。注意这两项与#include <string>的差异!(见下文的C++的字符串(类))
cstring和string.h其实里面都是C标准库提供的东西,某些实现中cstring的内容
就是:
namespace std
{
#include <string.h>
}
cstring是C++的组成部分,它可以说是把C的string.h的升级版,但它不是C的组成部分。
所以如果你用的是C++,那么请用cstring,如果你用的是C请用string.h。
在某一内存范围中查找一特定字符 | |
比较内存内容 | |
拷贝内存内容 | |
拷贝内存内容 | |
将一段内存空间填入某值 | |
连接两个字符串 | |
查找某字符在字符串中首次出现的位置 | |
比较两个字符串 | |
采用目前区域的字符排列次序来比较字符串 | |
拷贝字符串 | |
在某字符串中匹配指定字符串 | |
返回错误码对应的文本信息 | |
返回指定字符串的长度 | |
连接某一长度的两个字符串 | |
比较某一长度的两个字符串 | |
复制某一长度的一个字符串到另一字符串中 | |
查找某字符串在另一字符串中首次出现的位置 | |
查找某字符在字符串中末次出现的位置 | |
返回子串的长度,子串的字符都出现包含于另一字符串中 | |
在一字符串中查找指定的子串首次出现的位置 |
查找指定字符之前的子串 |
转换子串, 可以用于字符串比较 |
1.3 示例
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "ctype.h"
int main(){
char a[] = {'i',' ','a','m',' ','a',' ','s','t','u','d','e','n','t','\0'};
puts(a);
char acopy[100];
memcpy(acopy,a,strlen(a)+1); //----------->"string.h"
puts(acopy);//输出。相应的输入为gets。是C处理字符串的函数
char b[] = "100";
double bf = atof(b); //----------->"stdlib.h"
int bi = atoi("100.111");
printf("%f\n",bf);
printf("%d\n",bi);
char cU = 'A';
char cL = 'a';
int bcU = isupper(cU); //----------->"ctype.h"
int bcL = isupper(cL);
printf("%d\n",bcU);
printf("%d\n",bcL);
//说明:
//特殊表示(本质差不多):字符串常量:
//定义了一个指针变量,大小为sizeof(void *) = 4 个字节
//"i am a student":用双引号引起来的一系列支字符称为“字符串常量”,存放在内存中的全局数据区的常量池中,并追加串结束标志‘\0’,实为字符常量数组,其首地址用字符串常量本身表示
//char *pstr = "i am a student";
return 0;
}
/**
i am a student
i am a student
100.000000
100
1
0
Press any key to continue
*/
再来一个反例:
#include "string.h"//或者#include <cstring>
struct Student{
int id;
char name[9];
int Chinese,Math;
double average;
};
int main(){
Student x;
x.id = 1;
x.name="精神抖擞"; //<-------------------------error C2106: '=' : left operand must be l-value
return 0;
}
提示赋值表达式的左项必须是一个变量,不能是常量或表达式。x.name这个指针是常量。
解决办法:使用“string.h”中的strcpy函数!
2、除了上面用C库函数处理C字符串,C++同样可以处理C字符串:
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
int main(){
//C++对字符型指针给予特殊关照
//注意:它是不问是否越界,是否能够读写的。这些事程序员的责任
char str[100]; //一个足够大的容器存放C字符串
cin>>str;
cout<<str<<endl;
cout<<str+4<<endl;
cin.getline(str,100,'4');//向str中输入100个字符,输入过程中达到num个数或者提前遇到'4'字符,输入结束。
cout<<str<<endl;
/**
123456789
123456789
56789
*/
char s[] = "smart";
char *p;
for(p = s;*p;p++){
cout<<p<<endl;
}
/**
123456789
123456789
56789
123456789
123
smart
mart
art
rt
t
*/
// char *p = new char[100]; //将数组放到堆中
// delete p; //释放堆空间
return 0;
}
2、C++中的字符串
上面说到"string.h"、<cstring>等本质上是C标准库里面的东西,现在介绍一下C++标准库里面的字符串类:
<string>是c++语言中string类模板的申明 :
#include <string>
using std::string;
读取string:
#include <string>
#include <iostream>
using std::string;
using std::cin;
using std::cout;
using std::endl;
int main()
{
string s;
cin>>s; //hello world
cout<<s<<endl; //hello
cin.sync(); //清空输入缓冲区,否则可能出错。
cin>>s;
cout<<s<<endl;
cin.sync(); //清空输入缓冲区,否则可能出错。
string st;
std::getline(cin,st,'#');
cout<<st<<endl;
return 0;
}
运行结果:
q q
q
w w
w
h j#
h j
Press any key to continue
还有一点需要说明:为了与C兼容,C++的字符串字面量不是C++ string类型