C++ string 详解

合集下载

c_str函数

c_str函数

c_str函数c_str()函数是C++ STL(Standard Template Library)库中的一个函数,它主要用于将字符串类型的字符数组(包括C++字符串和C字符数组)转换为C类型字符串,即以'\0'结尾的字符数组。

在这篇文章中,我们将详细介绍c_str()函数及其用途、使用方法和注意事项。

c_str()函数的主要用途是将C++的string类型转换为C风格的字符串类型,也就是将string类型的字符串转换为const char类型的字符串,便于和C语言中的函数交互和传递参数。

C++中的string类型和C语言中的字符串类型的最大区别是,string类型是一个类,而C语言中的字符串类型只是一个字符序列,以'\0'结尾。

而C++中的string类型默认不以'\0'结尾,所以它不能像C语言中的字符串那样直接传递给C语言库函数使用。

为了解决这个问题,我们必须使用c_str()函数将string类型转换为C风格的字符串类型。

c_str()函数的用法非常简单,只需要在string变量后添加.c_str()即可。

例如:```C++std::string str = "Hello, world!";const char* cstr = str.c_str();```在这个例子中,我们先定义了一个string类型的变量str,并将其初始化为“Hello, world!”字符串。

然后,我们使用c_str()函数将str转换为C风格的字符串类型,并将结果保存在一个const char指针变量cstr中。

1. 返回值是const char*类型c_str()函数的返回类型是const char *类型,也就是指向一段以'\0'结尾的字符数组的指针。

由于返回的指针是指向string对象内部的字符数组,因此不能修改该指针指向的内容。

c_str函数用法

c_str函数用法

c_str函数用法c_str函数用法是一个C++字符串处理函数,其作用是将一个以null 结束的字符串作为输出。

它可以返回一个指向C风格字符串的指针,这个指针可以用来在C和C++之间交换数据。

c_str函数可以在C++中的string类对象上使用,以将C++字符串对象转换为C风格的字符串。

它的语法如下:const char* StringName.c_str( ) ;c_str函数的参数为空,它不需要任何参数。

它返回一个 const char * 指针,被指向的字符串以 null 结尾。

c_str函数是经常用到的一个函数,特别是在使用C库函数时,它可以避免我们额外的内存分配。

比如:当我们想给一个C函数传入一个字符串参数时,就可以使用 c_str 函数将C++ string类对象转换为 C 风格字符串,然后将这个 C风格字符串作为参数传入C函数。

例子:#include <iostream>#include <string>using namespace std;int main(){string str = "Hello World!";puts(str.c_str());return 0;}此外,c_str还可以用于把C风格字符串转换为C++ string类对象,以方便在C++程序中使用字符串。

例子:#include <iostream>#include <string>using namespace std;int main(){char *str = "Hello World!";string s(str);cout << s << endl;return 0;}总之,c_str函数是一个很实用的C++字符串处理函数。

它可以返回一个指向C风格字符串的指针,用来在C和C++之间交换数据,以及将C 风格字符串转换为C++ string类对象。

深入学习C++_String2.1版

深入学习C++_String2.1版

目录
目录 1
正文 4
一、 C++的string的使用 4
1.1 C++ string简介 4
1.2 string的成员 4
1.2.1 append 4
1.2.2 assign 5
1.2.3 at 5
1.2.4 begin 6
1.2.5 c_str 6
1.2.6 capacity 6
一、 C++的string的使用
1.1 C++ string简介
C++兼容C对字符串的处理方式,与此同时还在标准库(STL)中提供了string 容器,我们可以很容易的使用string来进行字符串处理。而且string还能很好的与标准库中的泛型算法结合起来使用,非常的方便。虽然在MFC等框架中也提供了诸如CString这样的字符串处理类,但是个人认为STL的string依然是最棒 的,使用标准库提供的string可以轻松的与原来的C API兼容 ,也可以很好的与系统底层的API兼容。
声明:
本文中选择的源码为MSSTL和boost1.37,例子为作者亲手所写,如果代码来自网络或者其它地方我会尽量声明出处。人难免会有疏漏,所以可能会有照顾不周的地方,我也无意侵害您的权益,如果您发现了这样的情况在本文档中出现,请您通知我,我保证马上更正。本文中凡是作者原创的内容,您可以随意修改与使用,欢迎您传播。
basic_string<CharType, Traits, Allocator>& append(
const_pointer _First,
const_pointer _Last

C标准库源码解剖(4):字符串处理函数string.h和wchar.h

C标准库源码解剖(4):字符串处理函数string.h和wchar.h

C标准库源码解剖(4):字符串处理函数string.h和wchar.h简要介绍资料的主要内容,以获得更多的关注C标准库源码解剖(4):字符串处理函数string.h和wchar.h分类:C 20XX年-10-08 12:39 648人阅读评论(1) 收藏举报string.h中包含了所有的字符串处理函数,也包含了内存处理函数,因为这些内存处理函数(如比如、复制、搜索)的功能与字符串处理函数功能类似。

我们是用通用指针来指向内存块的,通用指针可以用char*类型(传统C语言),也可以用void*类型(标准C语言)。

每个函数都有对应的宽字符版本,在wchar.h中。

string.h中包含的标准库函数:strcat,strncat,strcmp,strncmp,strcpy,strncpy,strlen,strchr,strrchr,strspn,strcsp n,strpbrk, strstr,strok,strcoll,strxfrm,strerror;memcpy,memmove,memcmp,memchr,memeset。

GNU还提供了很多非标准的扩展,如memccpy,rawmemchr,memrchr, strdup,strndup等。

view plaincopy to clipboardprint? 1. /* ISO C99 Standard: 7.21 字符串处理string.h */2. #ifndef _STRING_H3. #define _STRING_H 14. #include features.h /* 非标准头文件,定义了一些编译选项*/5. __BEGIN_DECLS6. /* 从stddef.h中获得size_t和NULL */7. #define __need_size_t8. #define __need_NULL9. #include stddef.h10. __BEGIN_*****CE_STD11. /* 从SRC中复制N个字节的内容到DEST中*/12. extern void *memcpy (void *__restrict __dest,13. __const void *__restrict __src, size_t __n)14. __THROW __nonnull ((1, 2));15. /* 从SRC中复制N个字节的内容到DEST中,保证对重叠字符串(即SRC与DEST共用存储空间)有正确的行为*/16. extern void *memmove (void *__dest, __const void *__src, size_t __n)17. __THROW __nonnull ((1, 2));18. __END_*****CE_STD19. /* 从SRC中复制不超过N个字节的内容到DEST中,当遇到字符C返回DEST中C的拷贝后面的字符指针。

C语言字符串替换:字符,字符串,字符数组详解

C语言字符串替换:字符,字符串,字符数组详解

C语⾔字符串替换:字符,字符串,字符数组详解⽬录案例描述案例分析必备知识1,字符数组(1)字符数组的定义(2)字符数组的初始化2,字符串概念(1)字符串的概念(2)⽤字符初始化字符数组(3)获取字符串的长度3,字符串与指针4,字符数组与字符指针总结案例描述字符串替换是处理字符串时最常见的操作之⼀,也是学习字符串必须掌握的知识。

本案例要求通过编程实现字符串“Good moring”到“Good evening”的转换。

案例分析我们需要从字符串中被替换的位置开始,将要替换的内容逐个复制到原字符串中,直到字符串结束或者替换的字符串结束为⽌。

为了顺利完成案例,需要先学习字符数组,字符串,字符指针等基础知识。

必备知识1,字符数组字符数组是存放字符数据的数组,其中每⼀个元素都是单个字符(1)字符数组的定义字符数组定义的语法格式如下:char 数组名[常量表达式];char 数组名[常量表达式1][常量表达式2]在上述语法中,分别列举了定义⼀维字符数组和⼆维字符数组的⽅法。

⽰例代码如下:char ch[6];(2)字符数组的初始化在数组定义的同时也可以对数组中的元素进⾏赋值,这个过程称为数组的初始化,⽰例代码如下:char c[5] = {'h','e','l','l','o'};注意字符数组的初始化很简单,但要注意以下⼏点。

(1)元素个数不能多于字符数组的⼤⼩,否则编译器会出错(2)如果初始项少于数组长度,则空余元素均会被赋值为空字符(‘\0')(3)如果没有指定数组⼤⼩,则编译器会根据初始项的个数为数组分配长度(4)也可以初始化⼆维数组(和整型数组基本⼀致)2,字符串概念(1)字符串的概念字符串是由数字、字母、下划线和空格等各种字符组成的⼀串字符,是个常量,字符串的末尾都默认有⼀个'\0'作为结束符。

"abcde"" "上⾯这两⾏都是字符串,只不过第⼆个字符串中的字符都是空格字符串在各种编程语⾔中都是⾮常重要的数据类型,但是C语⾔中没有字符串的固定类型,通常⽤字符数组的形式来存储和处理字符串,这种字符数组必须以'\0'结尾。

VC++ CString详解

VC++  CString详解

1、CString 对象的连接:用”+”2、格式化字符串:用CString 对象的Format()方法。

用这种方法的好处是你不用担心用来存放格式化后数据的缓冲区是否足够大,这些工作由CString类替你完成。

格式化是一种把其它不是字符串类型的数据转化为CString类型的最常用技巧。

*****CString s; s.Format(_T("%d"), total);我总是对我的字符串使用_T()宏,这是为了让我的代码至少有Unicode的意识#define _T(x) x // 非Unicode版本(non-Unicode version)而在Unicode环境下是如下定义的:#define _T(x) L##x // Unicode版本(Unicode version)所以在Unicode环境下,它的效果就相当于:s.Format(L"%d", total);如果你认为你的程序可能在Unicode的环境下运行,那么开始在意用Unicode 编码。

比如说,不要用sizeof() 操作符来获得字符串的长度,因为在Unicode环境下就会有2倍的误差。

我们可以用一些方法来隐藏Unicode的一些细节,比如在我需要获得字符长度的时候,我会用一个叫做DIM的宏,这个宏是在我的dim.h文件中定义的,我会在我写的所有程序中都包含这个文件:#define DIM(x) ( sizeof((x)) / sizeof((x)[0]) )这个宏不仅可以用来解决Unicode的字符串长度的问题,也可以用在编译时定义的表格上,它可以获得表格的项数,如下:class Whatever { ... };Whatever data[] = {{ ... },...{ ... },};for(int i = 0; i < DIM(data); i++) // 扫描表格寻找匹配项。

C++中string,wstring,CString常用方法

C++中string,wstring,CString常用方法

C++中string,wstring,CString常⽤⽅法⼀.概念 string和CString均是字符串模板类,string为标准模板类(STL)定义的字符串类,已经纳⼊C++标准之中.wstring是操作宽字符串的类.C++标准程序库对于string的设计思维就是让他的⾏为尽可能像基本类型,不会在操作上引起什么⿇烦。

CString是对string(字符串)和wstring(宽字符串)的⼀个封装,常⽤在mfc中.⽤来解决编码问题的. string/wstring和CString在使⽤中,要根据实际环境选取。

CString是MFC⾥的,string是STL⾥的,后者通⽤性强些,前者功能全些。

⼀般在mfc中使⽤CString更为好⼀些。

⼆.常⽤⽅法string/wstring常⽤⽅法:string类的构造函数:string(const char *s); //⽤const字符串s初始化string(int n,char c); //⽤n个字符c初始化此外,string类还⽀持默认构造函数和复制构造函数,如string s1;string s2="hello";都是正确的写法。

当构造的string太长⽽⽆法表达时会抛出length_error异常;string类的字符操作:const char &operator[](int n)const;const char &at(int n)const;char &operator[](int n);char &at(int n);operator[]和at()均返回当前字符串中第n个字符的位置,但at函数提供范围检查,当越界时会抛出out_of_range异常,下标运算符[]不提供检查访问。

const char *data()const;//返回⼀个⾮null终⽌的c字符数组const char *c_str()const;//返回⼀个以null终⽌的c字符串int copy(char *s, int n, int pos = 0) const;//把当前串中以pos开始的n个字符拷贝到以s为起始位置的字符数组中,返回实际拷贝的数⽬string的特性描述:int capacity()const; //返回当前容量(即string中不必增加内存即可存放的元素个数)int max_size()const; //返回string对象中可存放的最⼤字符串的长度int size()const; //返回当前字符串的⼤⼩int length()const; //返回当前字符串的长度bool empty()const; //当前字符串是否为空void resize(int len,char c);//把字符串当前⼤⼩置为len,并⽤字符c填充不⾜的部分string类的输⼊输出操作:string类重载运算符operator>>⽤于输⼊,同样重载运算符operator<<⽤于输出操作。

(完整版)C语言字符串操作总结大全(超详细)

(完整版)C语言字符串操作总结大全(超详细)
功能:将字符串source接到字符串target的后面
例程:
#include <iostream.h>
#include <string.h>
void main(void)
{
char str1[] = { "Tsinghua "};
char str2[] = { "Computer"};
cout <<strcpy(str1,str2)<<endl;
strncpy(char destination[], const char source[], int numchars);
strncpy:将字符串source中前numchars个字符拷贝到字符串destination中。
strncpy函数应用举例
原型:strncpy(char destination[], const char source[], int numchars);
C语言字符串操作总结大全(超详细)
1)字符串操作
strcpy(p, p1)复制字符串
strncpy(p, p1, n)复制指定长度字符串
strcat(p, p1)附加字符串
strncat(p, p1, n)附加指定长度字符串
strlen(p)取字符串长度
strcmp(p, p1)比较字符串
strcasecmp忽略大小写比较字符串
查找字串string中首次出现的位置, NULL结束符也包含在查找中.返回一个指针,指向字符c在字符串string中首次出现的位置,如果没有找到,则返回NULL.
char *strrchr(const char *string, int c);

C语言-字符串函数大全和详解

C语言-字符串函数大全和详解

函数返回strDestination值.
char *strncat(char *strDestination, const char *strSource, size_t count);
将源串strSource开始的count个字符添加到目标串strDest后. 源串strSource的字符会覆盖目标串strDestination后面的结束符NULL. 如果count大于源串长度, 则会用源串的长度值替换count值. 得到的新串后面会自动加上NULL结束符. 与strcat函数一样, 本函数不能处理源串与目标串重叠的情况.
函数返回strDestination值.
char *strset(char *string, int c);
将string串的所有字符设置为字符c, 遇到NULL结束符停止.
函数返回内容调整后的string指针.
char *strnset(char *string, int c, size_t count);
char *strcat(char *strDestination, const char *strSource);
将源串strSource添加到目标串strDestination后面, 并在得到的新串后面加上NULL结束符. 源串strSource的字符会覆盖目标串strDestination后面的结束符NULL. 在字符串的复制或添加过程中没有溢出检查, 所以要保证目标串空间足够大. 不能处理源串与目标串重叠的情况.
获取字符串长度, 字符串结束符NULL不计算在内.
没有返回值指示操作错误.
char *strrev(char *string);
将字符串string中的字符顺序颠倒过来. NULL结束符位置不变.

C语言-字符串函数大全和详解

C语言-字符串函数大全和详解

c语言字符串函数详解void *memset(void *dest, int c, size_t count);将dest前面count个字符置为字符c.返回dest的值.void *memmove(void *dest, const void *src, size_t count);从src复制count字节的字符到dest. 如果src和dest出现重叠, 函数会自动处理.返回dest的值.void *memcpy(void *dest, const void *src, size_t count);从src复制count字节的字符到dest. 与memmove功能一样, 只是不能处理src和dest出现重叠.返回dest的值.void *memchr(const void *buf, int c, size_t count);在buf前面count字节中查找首次出现字符c的位置. 找到了字符c或者已经搜寻了count 个字节, 查找即停止.操作成功则返回buf中首次出现c的位置指针, 否则返回NULL.void *_memccpy(void *dest, const void *src, int c, size_t count);从src复制0个或多个字节的字符到dest. 当字符c被复制或者count个字符被复制时, 复制停止.如果字符c被复制, 函数返回这个字符后面紧挨一个字符位置的指针. 否则返回NULL.int memcmp(const void *buf1, const void *buf2, size_t count);比较buf1和buf2前面count个字节大小.返回值< 0, 表示buf1小于buf2;返回值为0, 表示buf1等于buf2;返回值> 0, 表示buf1大于buf2.int memicmp(const void *buf1, const void *buf2, size_t count);比较buf1和buf2前面count个字节. 与memcmp不同的是, 它不区分大小写. 返回值同上.size_t strlen(const char *string);获取字符串长度, 字符串结束符NULL不计算在内.没有返回值指示操作错误.char *strrev(char *string);将字符串string中的字符顺序颠倒过来. NULL结束符位置不变.返回调整后的字符串的指针.char *_strupr(char *string);将string中所有小写字母替换成相应的大写字母, 其它字符保持不变.返回调整后的字符串的指针.char *_strlwr(char *string);将string中所有大写字母替换成相应的小写字母, 其它字符保持不变.返回调整后的字符串的指针.char *strchr(const char *string, int c);查找字符c在字符串string中首次出现的位置, NULL结束符也包含在查找中.返回一个指针, 指向字符c在字符串string中首次出现的位置, 如果没有找到, 则返回NULL. char *strrchr(const char *string, int c);查找字符c在字符串string中最后一次出现的位置, 也就是对string进行反序搜索, 包含NULL结束符.返回一个指针, 指向字符c在字符串string中最后一次出现的位置, 如果没有找到, 则返回NULL.char *strstr(const char *string, const char *strSearch);在字符串string中查找strSearch子串.返回子串strSearch在string中首次出现位置的指针. 如果没有找到子串strSearch, 则返回NULL. 如果子串strSearch为空串, 函数返回string值.char *strdup(const char *strSource);函数运行中会自己调用malloc函数为复制strSource字符串分配存储空间, 然后再将strSource复制到分配到的空间中. 注意要及时释放这个分配的空间.返回一个指针, 指向为复制字符串分配的空间; 如果分配空间失败, 则返回NULL值.char *strcat(char *strDestination, const char *strSource);将源串strSource添加到目标串strDestination后面, 并在得到的新串后面加上NULL结束符. 源串strSource的字符会覆盖目标串strDestination后面的结束符NULL. 在字符串的复制或添加过程中没有溢出检查, 所以要保证目标串空间足够大. 不能处理源串与目标串重叠的情况.函数返回strDestination值.char *strncat(char *strDestination, const char *strSource, size_t count);将源串strSource开始的count个字符添加到目标串strDest后. 源串strSource的字符会覆盖目标串strDestination后面的结束符NULL. 如果count大于源串长度, 则会用源串的长度值替换count值. 得到的新串后面会自动加上NULL结束符. 与strcat函数一样, 本函数不能处理源串与目标串重叠的情况.函数返回strDestination值.char *strcpy(char *strDestination, const char *strSource);复制源串strSource到目标串strDestination所指定的位置, 包含NULL结束符. 不能处理源串与目标串重叠的情况.函数返回strDestination值.char *strncpy(char *strDestination, const char *strSource, size_t count);将源串strSource开始的count个字符复制到目标串strDestination所指定的位置. 如果count 值小于或等于strSource串的长度, 不会自动添加NULL结束符目标串中, 而count大于strSource串的长度时, 则将strSource用NULL结束符填充补齐count个字符, 复制到目标串中. 不能处理源串与目标串重叠的情况.函数返回strDestination值.char *strset(char *string, int c);将string串的所有字符设置为字符c, 遇到NULL结束符停止.函数返回内容调整后的string指针.char *strnset(char *string, int c, size_t count);将string串开始count个字符设置为字符c, 如果count值大于string串的长度, 将用string 的长度替换count值.函数返回内容调整后的string指针.size_t strspn(const char *string, const char *strCharSet);查找任何一个不包含在strCharSet串中的字符(字符串结束符NULL除外) 在string串中首次出现的位置序号.返回一个整数值, 指定在string中全部由characters中的字符组成的子串的长度. 如果string 以一个不包含在strCharSet中的字符开头, 函数将返回0值.size_t strcspn(const char *string, const char *strCharSet);查找strCharSet串中任何一个字符在string串中首次出现的位置序号, 包含字符串结束符NULL.返回一个整数值, 指定在string中全部由非characters中的字符组成的子串的长度. 如果string以一个包含在strCharSet中的字符开头, 函数将返回0值.char *strspnp(const char *string, const char *strCharSet);查找任何一个不包含在strCharSet串中的字符(字符串结束符NULL除外) 在string串中首次出现的位置指针.返回一个指针, 指向非strCharSet中的字符在string中首次出现的位置.char *strpbrk(const char *string, const char *strCharSet);查找strCharSet串中任何一个字符在string串中首次出现的位置, 不包含字符串结束符NULL.返回一个指针, 指向strCharSet中任一字符在string中首次出现的位置. 如果两个字符串参数不含相同字符, 则返回NULL值.int strcmp(const char *string1, const char *string2);比较字符串string1和string2大小.返回值< 0, 表示string1小于string2;返回值为0, 表示string1等于string2;返回值> 0, 表示string1大于string2.int stricmp(const char *string1, const char *string2);比较字符串string1和string2大小,和strcmp不同, 比较的是它们的小写字母版本.返回值与strcmp相同.int strcmpi(const char *string1, const char *string2);等价于stricmp函数, 只是提供一个向后兼容的版本.int strncmp(const char *string1, const char *string2, size_t count);比较字符串string1和string2大小,只比较前面count个字符. 比较过程中, 任何一个字符串的长度小于count, 则count将被较短的字符串的长度取代. 此时如果两串前面的字符都相等, 则较短的串要小.返回值< 0, 表示string1的子串小于string2的子串;返回值为0, 表示string1的子串等于string2的子串;返回值> 0, 表示string1的子串大于string2的子串.int strnicmp(const char *string1, const char *string2, size_t count);比较字符串string1和string2大小,只比较前面count个字符. 与strncmp不同的是, 比较的是它们的小写字母版本.返回值与strncmp相同.char *strtok(char *strToken, const char *strDelimit);在strToken 串中查找下一个标记, strDelimit字符集则指定了在当前查找调用中可能遇到的分界符.返回一个指针, 指向在strToken中找到的下一个标记. 如果找不到标记, 就返回NULL值. 每次调用都会修改strToken内容, 用NULL字符替换遇到的每个分界符.本文来自CSDN博客,转载请标明出处:/wully_happy/archive/2008/03/25/2216575.aspx。

CString的常用方法

CString的常用方法

CString是MFC对字符串的封装, 它包含一个可变长的字符序列, 提供了很多串操作, 使用它比使用其他的字符串类型更加方便. CString没有继承任何类.CString中的各个字符都是TCHAR类型的, 它在UNICODE中是16位, 在普通字符集中是8位.CString对象可以随着串合并操作而动态增长其长度,而无须用户来对其长度进行专门设置. 你最好把CString看作一个串类型,而不是一个指向字符串的指针; 但CString可以转换为const char*和LPCTSTR类型, 也就是说, 以const char*和LPCTSTR为参数,也可以以CString 作为参数进行调用.一、CString的构造函数CString类拥有众多的构造函数, 用于以不同的数据类型和不同的方式构造一个字符串对象:CString(); //无参数的构造函数,产生一个空的CString对象CString(const CString& stringSrc); //用另一个CString对象的值初始化对象CString(TCHAR ch, int nRepeat=1);//用一个字符重复若干次来初始化对象CString(LPCTSTR lpch, int nLength);//用一个字符数组和一定长度来初始化对象CString(const unsigned char* psz);//从一个无符号字符指针构造对象CString(LPCWSTR lpsz);//从一个Unicode字符串来构造对象CString(LPCSTR lpsz);//从一个ANSI字符串构造对象可以把某些构造函数看作于类型转化。

下面是一些例子:CString s1;CString s2("big");CString s3 = s2;CString s4(S2 + " " + s3);CString s5(" x"); //s5=" x";CString s6(" x",7); //s6=" xxxxxxx";CString s7((LPCSTR)ID_FILE_NEW); //ID_FILE_NEW是一个资源IDCString city="Beijing";//注意不是同值运算符二、CString的基本操作得到字符串长度:即字符串包含的字符数,用函数GetLength,它返回一个int类型的数。

c中string的用法

c中string的用法

c中string的用法c中string的用法的用法你知道吗?下面小编就跟你们详细介绍下c中string的用法的用法,希望对你们有用。

c中string的用法的用法如下:为了在我们的程序中使用string类型,我们必须包含头文件<string>。

如下:#include <string> //注意这里不是string.h string.h是C字符串头文件#include <string>using namespace std;1.声明一个C++字符串声明一个字符串变量很简单:string Str;这样我们就声明了一个字符串变量,但既然是一个类,就有构造函数和析构函数。

上面的声明没有传入参数,所以就直接使用了string的默认的构造函数,这个函数所作的就是把Str初始化为一个空字符串。

String类的构造函数和析构函数如下:a) string s; //生成一个空字符串sb) string s(str) //拷贝构造函数生成str的复制品c) string s(str,stridx) //将字符串str内“始于位置stridx”的部分当作字符串的初值d) string s(str,stridx,strlen) //将字符串str内“始于stridx且长度顶多strlen”的部分作为字符串的初值e) string s(cstr) //将C字符串作为s的初值f) string s(chars,chars_len) //将C字符串前chars_len个字符作为字符串s的初值。

g) string s(num,c) //生成一个字符串,包含num个c字符h) string s(beg,end) //以区间beg;end(不包含end)内的字符作为字符串s的初值i) s.~string() //销毁所有字符,释放内存都很简单,我就不解释了。

2.字符串操作函数这里是C++字符串的重点,我先把各种操作函数罗列出来,不喜欢把所有函数都看完的人可以在这里找自己喜欢的函数,再到后面看他的详细解释。

C语言字符串操作总结大全(超详细)

C语言字符串操作总结大全(超详细)

C语⾔字符串操作总结⼤全(超详细)strcpy(p, p1) 复制字符串strncpy(p, p1, n) 复制指定长度字符串strcat(p, p1) 附加字符串strncat(p, p1, n) 附加指定长度字符串strlen(p) 取字符串长度strcmp(p, p1) ⽐较字符串strcasecmp忽略⼤⼩写⽐较字符串strncmp(p, p1, n) ⽐较指定长度字符串strchr(p, c) 在字符串中查找指定字符strrchr(p, c) 在字符串中反向查找strstr(p, p1) 查找字符串strpbrk(p, p1) 以⽬标字符串的所有字符作为集合,在当前字符串查找该集合的任⼀元素strspn(p, p1) 以⽬标字符串的所有字符作为集合,在当前字符串查找不属于该集合的任⼀元素的偏移strcspn(p, p1) 以⽬标字符串的所有字符作为集合,在当前字符串查找属于该集合的任⼀元素的偏移* 具有指定长度的字符串处理函数在已处理的字符串之后填补零结尾符strtod(p, ppend) 从字符串 p 中转换 double 类型数值,并将后续的字符串指针存储到 ppend 指向的 char* 类型存储。

strtol(p, ppend, base) 从字符串 p 中转换 long 类型整型数值,base 显式设置转换的整型进制,设置为 0 以根据特定格式判断所⽤进制,0x, 0X 前缀以解释为⼗六进制格式整型,0 前缀以解释为⼋进制格式整型atoi(p) 字符串转换到 int 整型atof(p) 字符串转换到 double 符点数atol(p) 字符串转换到 long 整型isalpha() 检查是否为字母字符isupper() 检查是否为⼤写字母字符islower() 检查是否为⼩写字母字符isdigit() 检查是否为数字isxdigit() 检查是否为⼗六进制数字表⽰的有效字符isspace() 检查是否为空格类型字符iscntrl() 检查是否为控制字符ispunct() 检查是否为标点符号isalnum() 检查是否为字母和数字isprint() 检查是否是可打印字符isgraph() 检查是否是图形字符,等效于 isalnum() | ispunct()功能:将字符串source拷贝到字符串destination中例程:#include <iostream.h>#include <string.h>void main(void){ char str1[10] = { "TsinghuaOK"}; char str2[10] = { "Computer"}; cout <<strcpy(str1,str2)<<endl;}运⾏结果是:Computer第⼆个字符串将覆盖掉第⼀个字符串的所有内容!注意:在定义数组时,字符数组1的字符串长度必须⼤于或等于字符串2的字符串长度。

转载:CC++关于string.h头文件和string类

转载:CC++关于string.h头文件和string类

转载:CC++关于string.h头⽂件和string类学习C语⾔时,⽤字符串的函数例如stpcpy()、strcat()、strcmp()等,要包含头⽂件string.h 学习C++后,C++有字符串的标准类string,string 类也有很多⽅法,⽤string类时要⽤到string.h头⽂件。

我现在看vc的书上也有CString类,这个要包含什么,怎么⽤?我现在很迷惑,这两个 string.h有什么区别。

是怎么回事且看⼀:这两个⼀个是标准C库的,定义了⼀些字符串的处理函数.⼀个是标准C++库的,定义了标准C++的std::string类. 要⽤这个类要包含头⽂件<string>...如下; #include <string> using namespace std;//关于名字空间有兴趣⾃⼰查去,⼀般⽤标准库这句就⾏了当然标准C库也是标准C++库的⼀部分,要⽤标准C库⾥的处理函数...如下: #include <string.h>//所以你⽤这句包含的是标准C库的头⽂件 ...或者⽤如下C++风格的,它们是等价的,不过⽐较推荐: #include <cstring> using namespace std;CString类是MFC的类,...不搞Windows MFC编程⽤不到且看⼆:#include < string .h >void main() {string aaa = " abcsd d " ;printf( " looking for abc from abcdecd %s/n " , (strcmp(aaa, " abc " )) ? " Found " : " Not Found " );} 不能正确执⾏,提⽰说是string类型没有定义 ⽽下⾯:#include < string >using namespace std; void main(){ string aaa = " abcsd d " ;printf( " looking for abc from abcdecd %s/n " , (strcmp(aaa, " abc " )) ? " Found " : " Not Found " ); } 这⾥的string编译器就认识了,但是strcmp就不认识了呢? ⼀般⼀个C++的⽼的带“。

VC++ CString详解

VC++  CString详解

1、CString 对象的连接:用”+”2、格式化字符串:用CString 对象的Format()方法。

用这种方法的好处是你不用担心用来存放格式化后数据的缓冲区是否足够大,这些工作由CString类替你完成。

格式化是一种把其它不是字符串类型的数据转化为CString类型的最常用技巧。

*****CString s; s.Format(_T("%d"), total);我总是对我的字符串使用_T()宏,这是为了让我的代码至少有Unicode的意识#define _T(x) x // 非Unicode版本(non-Unicode version)而在Unicode环境下是如下定义的:#define _T(x) L##x // Unicode版本(Unicode version)所以在Unicode环境下,它的效果就相当于:s.Format(L"%d", total);如果你认为你的程序可能在Unicode的环境下运行,那么开始在意用Unicode 编码。

比如说,不要用sizeof() 操作符来获得字符串的长度,因为在Unicode环境下就会有2倍的误差。

我们可以用一些方法来隐藏Unicode的一些细节,比如在我需要获得字符长度的时候,我会用一个叫做DIM的宏,这个宏是在我的dim.h文件中定义的,我会在我写的所有程序中都包含这个文件:#define DIM(x) ( sizeof((x)) / sizeof((x)[0]) )这个宏不仅可以用来解决Unicode的字符串长度的问题,也可以用在编译时定义的表格上,它可以获得表格的项数,如下:class Whatever { ... };Whatever data[] = {{ ... },...{ ... },};for(int i = 0; i < DIM(data); i++) // 扫描表格寻找匹配项。

C++中的c_str()

C++中的c_str()

C++中的c_str()c_str()函数返回⼀个指向正规C字符串的指针 const char*,内容就是string本⾝C++中的这个函数是为了与c语⾔兼容,c中⽆string类型,故必须通过string类对象的成员函数c_str()把string对象转换成c中的字符串样式#include<iostream>#include<cstring>using namespace std;int main(){const char* c;string s="1234";c=s.c_str();//直接在指针上操作cout<<c<<endl;s="abcd";cout<<c<<endl;return0;}结果:1234 abcd这样通过c指针进⾏操作,会是字符串发⽣改变。

#include<iostream>#include<cstring>using namespace std;int main(){char *c=new char[20];string s="1234";strcpy(c,s.c_str());//通过strcpy()函数头⽂件#include<string.h>c⾥⾯的⼀个字符串复制的函数返回char*cout<<c<<endl;s="abcd";cout<<c<<endl;return0;}结果:1234 1234通过strcpy()函数进⾏复制,之后的操作并不会改变字符串c_str()返回的是⼀个临时指针,不能对其进⾏操作,不需要⼿动释放或删除。

strcpy与strncpy的区别第⼀种情况:1 2 3 4 5 6 7 8 9 char* p="how are you ?";char name[20]="ABCDEFGHIJKLMNOPQRS";strcpy(name,p);//name改变为"how are you ? "====>正确!strncpy(name,p, sizeof(name));//name改变为"how are you ?" =====>正确!后续的字符将置为NULL第⼆种情况:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 char* p="how are you ?";char name[10];strcpy(name,p);//⽬标串长度⼩于源串,错误!name[sizeof(name)-1]='\0';//和上⼀步组合,弥补结果,但是这种做法并不可取,因为上⼀步出错处理⽅式并不确定strncpy(name,p,sizeof(name));//源串长度⼤于指定拷贝的长度sizeof(name),注意在这种情况下不会⾃动在⽬标串后⾯加'\0' name[sizeof(name)-1]='\0';//和上⼀步组合,弥补结果。

c语言中string.h用法

c语言中string.h用法

在C语言中,`string.h`头文件包含了一系列处理字符串的函数。

以下是一些常用的`string.h`函数及其用法:1. **strlen() - 计算字符串长度**```c#include <string.h>size_t strlen(const char *str);```示例:```cconst char *myString = "Hello, World!";size_t length = strlen(myString);printf("String length: %zu\n", length);```2. **strcpy() - 复制字符串**```c#include <string.h>char *strcpy(char *dest, const char *src);```示例:```cchar destination[20];const char *source = "Copy me!";strcpy(destination, source);printf("Copied string: %s\n", destination); ```3. **strcat() - 拼接字符串**```c#include <string.h>char *strcat(char *dest, const char *src); ```示例:```cchar str1[20] = "Hello, ";const char *str2 = "World!";strcat(str1, str2);printf("Concatenated string: %s\n", str1); ```4. **strcmp() - 比较字符串**```c#include <string.h>int strcmp(const char *str1, const char *str2); ```示例:```cconst char *s1 = "apple";const char *s2 = "orange";int result = strcmp(s1, s2);if (result == 0) {printf("Strings are equal.\n");} else if (result < 0) {printf("s1 is less than s2.\n");} else {printf("s1 is greater than s2.\n");}```5. **strncmp() - 指定长度比较字符串**```c#include <string.h>int strncmp(const char *str1, const char *str2, size_t n);```示例:```cconst char *s1 = "apple";const char *s2 = "apples";int result = strncmp(s1, s2, 5); // 比较前五个字符```6. **strchr() - 在字符串中查找字符**```c#include <string.h>char *strchr(const char *str, int c);```示例:```cconst char *myString = "Hello, World!";char *result = strchr(myString, 'W');if (result != NULL) {printf("Found at position: %ld\n", result - myString);} else {printf("Character not found.\n");}```7. **strstr() - 在字符串中查找子串**```c#include <string.h>char *strstr(const char *haystack, const char *needle); ```示例:```cconst char *text = "This is a simple example.";const char *pattern = "simple";char *result = strstr(text, pattern);if (result != NULL) {printf("Substring found at position: %ld\n", result - text);} else {printf("Substring not found.\n");}```这只是`string.h`头文件中一些常用函数的简要介绍。

CC++编程判断String字符串是否包含某个字符串实现示例

CC++编程判断String字符串是否包含某个字符串实现示例

CC++编程判断String字符串是否包含某个字符串实现⽰例⽬录⼀、C语⾔风格⼆、C++风格⼀、C语⾔风格在C语⾔中,字符串存储为字符数组,以'\0'结束。

在C的接⼝中,有strstr函数,可以在字符串中查找另⼀个字符串。

char * strstr(const char *str1, const char *str2);功能为在str1中查找str2,如果存在,那么返回查找到的起始指针,否则返回NULL。

参考代码:#include <iostream>#include <string>#include <cstring>using namespace std;int main(){string a= "abcdefghigklmn" ;char *b= "def" ;char *c= "123" ;if ( strstr (a.c_str(), b) == NULL) //在a中查找b,如果不存在,cout << "not found\n" ; //输出结果。

else //否则存在。

cout << "found\n" ; //输出结果。

if ( strstr (a.c_str(), c) == NULL) //在a中查找b,如果不存在,cout << "not found\n" ; //输出结果。

else //否则存在。

cout << "found\n" ; //输出结果。

return 0;}⼆、C++风格C++的string类提供了字符串中查找另⼀个字符串的函数find。

其重载形式为:string::size_type string::find(string &);功能为在string对象中,查找参数string类型的字符串是否存在,如果存在,返回起始位置。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C++ string 详解之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必担心内存是否足够、字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至是100%)的需要。

我们可以用= 进行赋值操作,== 进行比较,+ 做串联(是不是很简单?)。

我们尽可以把它看成是C++的基本数据类型。

好了,进入正题………首先,为了在我们的程序中使用string类型,我们必须包含头文件<string>。

如下:#include <string> //注意这里不是string.h string.h是C字符串头文件1.声明一个C++字符串声明一个字符串变量很简单:string Str;这样我们就声明了一个字符串变量,但既然是一个类,就有构造函数和析构函数。

上面的声明没有传入参数,所以就直接使用了string的默认的构造函数,这个函数所作的就是把Str 初始化为一个空字符串。

String类的构造函数和析构函数如下:a) string s; //生成一个空字符串sb) string s(str) //拷贝构造函数生成str的复制品c) string s(str,stridx) //将字符串str内“始于位置stridx”的部分当作字符串的初值d) string s(str,stridx,strlen) //将字符串str内“始于stridx且长度顶多strlen”的部分作为字符串的初值e) string s(cstr) //将C字符串作为s的初值f) string s(chars,chars_len) //将C字符串前chars_len个字符作为字符串s的初值。

g) string s(num,c) //生成一个字符串,包含num个c字符h) string s(beg,end) //以区间beg;end(不包含end)内的字符作为字符串s的初值i) s.~string() //销毁所有字符,释放内存都很简单,我就不解释了。

2.字符串操作函数这里是C++字符串的重点,我先把各种操作函数罗列出来,不喜欢把所有函数都看完的人可以在这里找自己喜欢的函数,再到后面看他的详细解释。

a) =,assign() //赋以新值b) swap() //交换两个字符串的内容c) +=,append(),push_back() //在尾部添加字符d) insert() //插入字符e) erase() //删除字符f) clear() //删除全部字符g) replace() //替换字符h) + //串联字符串i) ==,!=,<,<=,>,>=,compare() //比较字符串j) size(),length() //返回字符数量k) max_size() //返回字符的可能最大个数l) empty() //判断字符串是否为空m) capacity() //返回重新分配之前的字符容量n) reserve() //保留一定量内存以容纳一定数量的字符o) [ ], at() //存取单一字符p) >>,getline() //从stream读取某值q) << //将谋值写入streamr) copy() //将某值赋值为一个C_strings) c_str() //将内容以C_string返回t) data() //将内容以字符数组形式返回u) substr() //返回某个子字符串v)查找函数w)begin() end() //提供类似STL的迭代器支持x) rbegin() rend() //逆向迭代器y) get_allocator() //返回配置器下面详细介绍:2.1 C++字符串和C字符串的转换C ++提供的由C++字符串得到对应的C_string的方法是使用data()、c_str()和copy(),其中,data()以字符数组的形式返回字符串内容,但并不添加‟\0‟。

c_str()返回一个以…\0‟结尾的字符数组,而copy()则把字符串的内容复制或写入既有的c_string或字符数组内。

C++字符串并不以‟\0‟结尾。

我的建议是在程序中能使用C++字符串就使用,除非万不得已不选用c_string。

由于只是简单介绍,详细介绍掠过,谁想进一步了解使用中的注意事项可以给我留言(到我的收件箱)。

我详细解释。

2.2 大小和容量函数一个C++字符串存在三种大小:a)现有的字符数,函数是size()和length(),他们等效。

Empty()用来检查字符串是否为空。

b)max_size() 这个大小是指当前C++字符串最多能包含的字符数,很可能和机器本身的限制或者字符串所在位置连续内存的大小有关系。

我们一般情况下不用关心他,应该大小足够我们用的。

但是不够用的话,会抛出length_error异常c)capacity()重新分配内存之前string所能包含的最大字符数。

这里另一个需要指出的是reserve()函数,这个函数为string重新分配内存。

重新分配的大小由其参数决定,默认参数为0,这时候会对string进行非强制性缩减。

还有必要再重复一下C++字符串和C字符串转换的问题,许多人会遇到这样的问题,自己做的程序要调用别人的函数、类什么的(比如数据库连接函数Connect(char*,char*)),但别人的函数参数用的是char*形式的,而我们知道,c_str()、data()返回的字符数组由该字符串拥有,所以是一种const char*,要想作为上面提及的函数的参数,还必须拷贝到一个char*,而我们的原则是能不使用C字符串就不使用。

那么,这时候我们的处理方式是:如果此函数对参数(也就是char*)的内容不修改的话,我们可以这样Connect((char*)UserID.c_str(), (char*)PassWD.c_str()),但是这时候是存在危险的,因为这样转换后的字符串其实是可以修改的(有兴趣地可以自己试一试),所以我强调除非函数调用的时候不对参数进行修改,否则必须拷贝到一个char*上去。

当然,更稳妥的办法是无论什么情况都拷贝到一个char*上去。

同时我们也祈祷现在仍然使用C字符串进行编程的高手们(说他们是高手一点儿也不为过,也许在我们还穿开裆裤的时候他们就开始编程了,哈哈…)写的函数都比较规范,那样我们就不必进行强制转换了。

2.3元素存取我们可以使用下标操作符[]和函数at()对元素包含的字符进行访问。

但是应该注意的是操作符[]并不检查索引是否有效(有效索引0~str.length()),如果索引失效,会引起未定义的行为。

而at()会检查,如果使用at()的时候索引无效,会抛出out_of_range异常。

有一个例外不得不说,const string a;的操作符[]对索引值是a.length()仍然有效,其返回值是‟\0‟。

其他的各种情况,a.length()索引都是无效的。

举例如下:cons t string Cstr(“const string”);string Str(“string”);Str[3]; //okStr.at(3); //okStr[100]; //未定义的行为Str.at(100); //throw out_of_rangeStr[Str.length()] //未定义行为Cstr[Cstr.length()] //返回 0Str.at(Str.length());//throw out_of_rangeCstr.at(Cstr.length()) ////throw out_of_range我不赞成类似于下面的引用或指针赋值:char& r=s[2];char* p= &s[3];因为一旦发生重新分配,r,p立即失效。

避免的方法就是不使用。

2.4比较函数C ++字符串支持常见的比较操作符(>,>=,<,<=,==,!=),甚至支持string与C-string的比较(如str<”hello”)。

在使用>,>=,<,<=这些操作符的时候是根据“当前字符特性”将字符按字典顺序进行逐一得比较。

字典排序靠前的字符小,比较的顺序是从前向后比较,遇到不相等的字符就按这个位置上的两个字符的比较结果确定两个字符串的大小。

同时,string (“aaaa”) <string(aaaaa)。

另一个功能强大的比较函数是成员函数compare()。

他支持多参数处理,支持用索引值和长度定位子串来进行比较。

他返回一个整数来表示比较结果,返回值意义如下:0-相等〉0-大于<0-小于。

举例如下:string s(“abcd”);pare(“abcd”); //返回0pa re(“dcba”); //返回一个小于0的值pare(“ab”); //返回大于0的值pare(s); //相等pare(0,2,s,2,2); //用”ab”和”cd”进行比较小于零pare(1,2,”bcx”,2); //用”bc”和”bc”比较。

怎么样?功能够全的吧!什么?还不能满足你的胃口?好吧,那等着,后面有更个性化的比较算法。

先给个提示,使用的是STL的比较算法。

什么?对STL一窍不通?靠,你重修吧!2.5 更改内容这在字符串的操作中占了很大一部分。

首先讲赋值,第一个赋值方法当然是使用操作符=,新值可以是string(如:s=ns) 、c_string(如:s=”gaint”)甚至单一字符(如:s=‟j‟)。

还可以使用成员函数assign(),这个成员函数可以使你更灵活的对字符串赋值。

还是举例说明吧:s.assign(str); //不说s.assign(str,1,3);//如果str是”iamangel” 就是把”ama”赋给字符串s.assign(str,2,string::npos);//把字符串str从索引值2开始到结尾赋给ss.assign(“gaint”); //不说s.assign(“nico”,5);//把‟n‟ …I‟ …c‟ …o‟ …\0‟赋给字符串s.assign(5,‟x‟);//把五个x赋给字符串把字符串清空的方法有三个:s=””;s.clear();s.erase();(我越来越觉得举例比说话让别人容易懂!)。

string提供了很多函数用于插入(insert)、删除(erase)、替换(replace)、增加字符。

先说增加字符(这里说的增加是在尾巴上),函数有+=、append()、push_back()。

举例如下:s+=str;//加个字符串s+=”my name is jiayp”;//加个C字符串s+=‟a‟;//加个字符s.append(str);s.append(str,1,3);//不解释了同前面的函数参数assign的解释s.append(str,2,string::npos)//不解释了s.append(“my name is jiayp”);s.append(“nico”,5);s.append(5,‟x‟);s.push_back(…a‟);//这个函数只能增加单个字符对STL熟悉的理解起来很简单也许你需要在string中间的某个位置插入字符串,这时候你可以用insert()函数,这个函数需要你指定一个安插位置的索引,被插入的字符串将放在这个索引的后面。

相关文档
最新文档