C++:与C、C++、MFC有关的字符串们

一直对这个问题有疑问,今天总结一下:

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 实现

参见:http://blog.csdn.net/huangjing_whlg/article/details/21337043

1.2 相关库函数

C标准库中对C字符串的操作:

1.2.1 stdlib.h :C标准库中的一个大杂烩库

atof()

将字符串转换成浮点数

atoi()

将字符串转换成整数

atol()

将字符串转换成长整型数

strtod()

将字符串转换成浮点数

strtol()

将字符串转换成长整型数

strtoul()

将字符串转换成无符号长整型数

1.2.2 ctype.h :这个主要是C标准库中字符处理的库,暂且把它也搁在这吧。它传入的参数一般熟int型的。

isalnum()

当字母或数字字符时, 返回真值

isalpha()

当字母字符时, 返回真值

iscntrl()

当控制字符时, 返回真值

isdigit()

当数字字符时, 返回真值

isgraph()

当非空格可打印字符时, 返回真值

islower()

当小写字母字符时, 返回真值

isprint()

当可打印字符时, 返回真值

ispunct()

当标点字符时, 返回真值

isspace()

当空格字符时, 返回真值

isupper()

当大写字母字符时, 返回真值

isxdigit()

当十六进制字符时, 返回真值

tolower()

将字符转换成小写字符

toupper()

将字符转换成大写字符


1.2.3 string.h:

C语言里面关于字符数组函数定义的头文件,常用函数有strlenstrcmpstrcpy等等,更详细的可以到include文件夹里面查看该文件。

和C++的cstring对应,是c版本的头文件,包含比如strcpy之类的字符串处理函数

cstringC++对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。

memchr()

在某一内存范围中查找一特定字符

memcmp()

比较内存内容

memcpy()

拷贝内存内容

memmove()

拷贝内存内容

memset()

将一段内存空间填入某值

strcat()

连接两个字符串

strchr()

查找某字符在字符串中首次出现的位置

strcmp()

比较两个字符串

strcoll()

采用目前区域的字符排列次序来比较字符串

strcpy()

拷贝字符串

strcspn()

在某字符串中匹配指定字符串

strerror()

返回错误码对应的文本信息

strlen()

返回指定字符串的长度

strncat()

连接某一长度的两个字符串

strncmp()

比较某一长度的两个字符串

strncpy()

复制某一长度的一个字符串到另一字符串中

strpbrk()

查找某字符串在另一字符串中首次出现的位置

strrchr()

查找某字符在字符串中末次出现的位置

strspn()

返回子串的长度,子串的字符都出现包含于另一字符串中

strstr()

在一字符串中查找指定的子串首次出现的位置

strtok()

查找指定字符之前的子串

strxfrm()

转换子串, 可以用于字符串比较           

1.3 示例

1、用C标准库处理

#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类型

3、MFC中的字符串

CString是MFC中定义的字符串类,MFC中很多类及函数都是以CString为参数的,另外CString类重载了(LPCSTR)运算符,所以如果你在MFC下面使用CString类,就可以直接用CString类做为参数来调用需要一个C语言风格字符串的win   api函数,编译器会自动调用(LPCSTR)成员函数完成从CString到一个C风格字符串的转换。如果你在MFC下使用C++语言中标准的 string类,那么在调用需要C语言风格的字符串为参数的win   api时,你必须显示调用sting.c_str()成员函数,来完成同样的转换,也就是说在使用MFC里,如果用CString类,会比sting类方便那么一点点。

待续
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值