字符串用数组表示:

char str[10];

使用字符数组来标记字符串称为“C风格字符串”。但是使用字符数组来表示字符串有很多不方便的地方:

1 修改困难:如str的初始化和赋值都要通过逐个字符赋值操作;

2 长度限制:如str的长度最多就是10,而且最后一个元素还要用“\0”字符数组结果标记;

3 粒度太小、不直观:

C++不仅支持C风格字符串的使用,还引入string类的概念,该类提供丰富的接口:

 

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char* argv[])
{
string str1 ;
string str2 = "Your name is :" ;
cout<<"Enter you name is:"<<endl;
cin>>str1 ;
cout<<str2<<" "<<str1<<endl;
cout<<str1.size()<<endl;
string str3 = str1 + str2;
cout<<str3 ;
cin.get();
return 0 ;
}

 

string类与C风格的char*字符串:

const char*字符串可以通过赋值的方式直接转换为string类,而string类也提供了一个方法,使得string类可以快速地转换为const char*类型字符串。这个方法就是c_str()函数。此函数没有参数,当string对象调用该函数时,返回的是指向字符串的指针。如:

const char * s;

string str("hello");

s = str.c_str();

示例

#include <iostream>

#include <string>

using namespace std;

void main()

{

string str("

hellow world!");

const char *str1;

char str2[20];

str1 = str.c_str(); //转换为const char *

count<<str1 << endl;

strcpy(str2,str1); //转换为 char*

str2[4] = '* ';

cout<< str2 << endl;

}

编译、运行后得到如下结果:

hellow world!

hell* world!

一: C风格字符串连接
#include <iostream>
using namespace std;

int main()
{
const char *str = "hello ";
const char *str2 = "world";
const size_t len = strlen(str)+strlen(str2);
char *n_str = new char[len+1];
strcpy(n_str,str);
strcat(n_str,str2);
cout<<n_str<<endl;
delete [] n_str;
return 0;
}

二|:C++ string类型字符串
#include <iostream>
#include <string>
using namespace std;

int main()
{
const string str="hello ";
const string str2="world";
string n_str;
n_str = str;
n_str +=str2;
cout<<n_str<<endl;
return 0;
}

示例

CString m_str1 = "abcdef";

CString m_str2 = "deq";

int index = m_str1.Find(m_str2);

if(index >= 0){

...finded

}else{

...no find

}

m_str.TrimLeft();

m_str.TrimRight();

VC定义一个字符串变量:

1 recordsDlg.h :

CString m_docx;

CString m_xlsx;

2 recordsDlg.cpp :

m_docx = _T("");

m_xlsx = "F:\\Website\\notes\\notes.xlsx";


先用SetSel选中指定范围的文字,然后再调用GetSelText获取选中部分的文字。SetSel(0, -1); // 选中全部文字SetSel(-1, -1); // 选中文字结尾处。

 

访问字符串中的字符

string 字符串也可以像字符串数组一样按照下标来访问其中的每一个字符。string 字符串的起始下标仍是从 0 开始。请看下面的代码:

#include #include using namespace std;
int main(){
    string s1 ;
    s1 = "1234567890";
    for(int i=0, len=s1.length(); i<len; i++)
        cout<<s1[i]<<" ";
    cout<<endl;
    s1[5] = '5';
    cout<<s1<<endl;
    return 0;
}

运行结果:
1 2 3 4 5 6 7 8 9 0
1234557890

本例中定义了一个 string 变量 s1,并赋值 "1234567890",之后用 for 循环遍历输出每一个字符。借助下标,除了能够访问每个字符,也可以修改每个字符。

字符串的拼接

有了 string 类,我们可以使用”+“或”+=“运算符来直接拼接字符串,非常方便,再也不需要使用C语言中的 strcat()、strcpy()、malloc() 等函数来拼接字符串了,再也不用担心空间不够会溢出了。

用”+“来拼接字符串时,运算符的两边可以都是 string 字符串,也可以是一个 string 字符串和一个C风格的字符串,还可以是一个 string 字符串和一个 char 字符。请看下面的例子:

#include 
#include 
using namespace std;

int main(){
    string s1, s2, s3;
    s1 = "first";
    s2 = "second";
    s3 = s1 + s2;
    cout<< s3 <<endl;
	<< s2 <<endl;
    s1 += "third";
    cout<< s1 <<endl;
    s1 += 'a';
    cout<< s1 <<endl;
    return 0;
}

运行结果:
firstsecond
secondfirst
firstthird
firstthirda

string提供字符串的功能,使用时需要引用头文件<string>。string和vector类似,vector是对数组的封装,而string是对字符串的封装。

从面向对象的角度来说,C风格字符串是以难以操纵的,所以STL里提供了面向对象的string封装。

string内部仍然是维护一个char型数组,并且也是以0结尾的。对外提供了字符串操作常用的函数,如append,clear,at,length等操作。

 

string和CString

CString 是MFC或者ATL中的实现,string是C++标准库中的实现。

string和CString均是字符串模板类,string为标准模板类(STL)定义的字符串类,已经纳入C++标准之中;

CString(typedef CStringT> CString)为Visual C++中最常用的字符串类,继承自CSimpleStringT类,主要应用在MFC和ATL编程中,主要数据类型有char(应用于ANSI),wchar_t(unicode),TCHAR(ANSI与unicode均可);

char*为C编程中最常用的字符串指针,一般以’\0’为结束标志;

在MFC、ATL中使用字符串尽量使用CString,毕竟都是微软的孩子,各方面都比其它更有优势,而在非微软平台上或对移植性要求较高的场合推荐使用string,标准模板库提供了那么强大的泛型算法,没必要再自己去造车轮。

(1)CString 类是微软的visual c++提供的MFC里面的一个类,所以只有支持MFC的工程才可以使用。如在linux上的工程就不能用CString了,只能用标准C++中的 string类了。另外,因为string类是在c++标准库中,所以它被封装在了std命名空间中,使用之前需要声明using namespace std;而CString类并不在std命名空间中,因为它不是c++的标准库,只是微软的一个封装库。这点看来用string类的程序的移植性更好。

(2)string类既是一个标准c++的类库,同时也是STL(Standard Template Library,标准模版库)中的类库,所以支持Iterator操作。

(3)CString类和string类提供的方法接口并不完全相同,所以不要糊里糊涂的认为某个类中怎么没有另外一个类中的方法。

(4)他们和char*之间的转换方法也不一样。

string是语言的东西,是c++语言的。CString是VC++ IDE内嵌的,是MFC的。CString离开VC++不能用,string 在任何支持C++的IDE中都能用。

<string.h>

<string.h>是C版本的头文件,包含比如strcpy、strcat之类的字符串处理函数。

<cstring>

在C++标准化(1998年)过程中,为了兼容以前,标准化组织将所有这些文件都进行了新的定义,加入到了标准库中,加入后的文件名就新增了一个"c"前缀并且去掉了.h的后缀名,所以string.h头文件成了cstring头文件。但是其实现却是相同的或是兼容以前的,这就是<cstring>的来源,不要觉得又多了一个东西。相当于标准库组织给它盖了个章,说“你也是我的标准程序库的一份子了”。

<string>

<string>是C++标准定义的头文件,它定义了一个string的字符串类,里面包含了string类的各种操作,如s.size(),s.erase(),s.insert()等。但<string>又包含了老的C版本的字符串操作如strcpy、strcat等,这就相当于,在<string>的文件中除了定义自己的string类之外,还加了一个#include<string.h>一句包含了C版本的字符串操作。

C 风格字符串,C++string类,MFC,CString类的区别。

字符串,顾名思义是由字符组成的字符串,在标准C,标准C++,MFC中字符串这一功能的实现是不相同的,C++完全兼容了C。

1.标准C中的字符串

在标准C中没有string这样的数据类型,C中的字符串是有char类型的字符数组或者char类型的字符指针来实现的。例如:

char name[26]="This is a C-style string";或者

char *name="This is a C-style string";

类型的字符串以\0为结束标记,所占内存是实际子符长度+1,其初始化和赋值都要逐个字符的赋值,修改不辨,粒度太小,很不直观,是程序员分散了一些软件的高级层面问题,如算法,抽象数据类型或软件构架。char *没有构造函数,仅能由指针赋值,而且是一个极其危险的操作,在声明char *的时候如果没有赋初值,建议先初始化为NULL,以免出现悬浮指针或者指向地址不明的指针,否则,出错会让你很爽!

标准C中是没有string类型,但是在C中有string.h头文件,需要注意的是此string.h中的string非彼string,<string.h>头文件中定义了一些我们经常用到的操作字符串的函数,如复制函数strcpy,连接字符串strcat,比较字符串strcmp,这些函数的操作对象都是指向char *的字符串。

2.标准C++中的string类

C++支持C风格字符串的使用,而且引入了string类的概念,string为标准模板类STL定义的字符串,几乎可以从所有的字符串构造出来。

string字符串类的都文件是<string>,并且要和using namespace std; 一起使用。头文件<string>和头文件<string.h>没有任何关系,前者是标准C++中的模板库类,后者是标准C中的包含常用C字符串处理函数的头文件,如strcmp,前者并非是后者的升级版。

要深刻理解标准C++中string是一个类,如在标准C中定义如下:char * pt=NULL; 这无疑是正确的,但是在标准C++中定义 string *pt=NULL;这样做编译器不会有警告和错误,但是运行是就会有异常。这是因为string作为一个类,定义类的对象时要调用其构造函数的,上面的例子既没有调用其构造函数,还把指针赋值为NULL,很明显就会出错的。正确的方法是是new操作符,C++中的new不同于C中的malloc, new不但会分配一块内存,还调用类的构造函数。string *pt=new("this is a c++-style string");或者不用指针string str;系统自动调用默认的构造函数,构造一个string类的对象。

3. MFC中的CString类。

MFC中的字符串类是CString,封装了string的东西,并增加了一些接口,在功能上完全兼容string类,而一些标准的C/C++不能直接对CString类进行操作,CString 类是微软的visual c++提供的MFC里面的一个类,所以只有支持MFC的工程才可以使用。如在linux上的工程就不能用CString了,只能用标准C++中的 string类了。另外,因为string类是在c++标准库中,所以它被封装在了std命名空间中,使用之前需要声明using namespace std;而CString类并不在std命名空间中,因为它不是c++的标准库,只是微软的一个封装库。这点看来用string类的程序的移植性更好。CString和string提供的接口方法不同,对char*的转换也不同。下面的转换内容来自CSDNBLOG:http://blog.csdn.net/bitxinhai/article/details/2292014

4.1 CString 和string的转换

string str="ksarea";
CString cstr(str.c_str()); //或者CString cstr(str.data());初始化时才行
cstr=str.c_str();或者cstr=str.data();
str=cstr.GetBuffer(0);//CString -> string
cstr.format("%s",str.c_str()); //string->CString
cstr.format("%s",str.data()); //string->CString
str=LPCSTR(cstr);//CString->string
/*c_str()和data()区别是:前者返回带'/0'的字符串,后者则返回不带'/0'的字符串*/

4.2.CString和int的转换int i=123;
CString str;
str.format("%d",i); //int->CString其他的基本类型转化类似
i=atoi(str);//CString->int还有(atof,atol)

4.3.char*
和CString的转换
CString cstr="ksarea";
char* ptemp=cstr.getbuffer(0);
char* str;
strcpy(str,ptemp);//CString->char*
cstr.releasebuffer(-1);
char*str="lovesha";
CString cstr=str;//char*->CString

string类型不能直接赋值给CString。至于int与float、string与char*之间的转化可以使用强制转化,或者标准库函数进行。对于CString与其他类型的转化方法很多,但其实都殊途同归,朝着一个方向即将类型首先转化为char*类型,因为char*是不同类型之间的桥梁。得到char*类型,转化为其他类型就非常容易了。这篇文章: http://hi.baidu.com/sage_haokun/blog/item/a44b9733aa14d812ebc4afbc.html ,还不错,主要讲述CString和string的区别,感兴趣的可以去瞅一下。