【字符串】C++中关于字符串操作的函数或关键字

#include <string>
#include <iostream>
using namespace std;
string str,str1,str2;
char sc[];

本文所讨论的string均指头文件<string>里的string结构,所以必须先包含该头文件。

ASCII码(从小到大) 48~57: 0~9             65~90: A~Z         97~122: a~z

【输入输出

cin>>str; //会读取第一个非空字符直到遇到空格或换行。所以当输入字符串后按回车会完成输入,但若输入字符串后按空格可继续输入,不过空格之后的都不会被读取到str中。

cin>>str1>>str2;//读取第一个非空字符直到空格或换行传给str1,再读取非空字符直到空格或换行传给str2. 若仅输入一个字符串,则程序会等待用户输入第二个字符串。

getline(cin,str);//将回车之前的所有字符存入str,可以用于有空格的字符串输入。

cout<<str;//输出字符串。

cout<<str[i];//输出字符串的第i+1个字符,注意i可以超过有效长度1位,即输出最后的'\0'位,效果是什么也没有。另外,'\0'的ASCII码为0,和NULL等价。 但不能继续往后超出,过了字符串结束字符后会出错!

cout<<sc[i];//输出字符数组中距离首字符为i的字符,i可以是任意数,即使超过了数组范围。

char *sc1=new char[n]; 

或 char *sc1=sc;

这是char*型的唯一用法,将字符数组的头指针传向sc1。之后sc1的操作与sc无异。(不能把string型传给char *型。)

cout<<sc1[i];//输出字符数组中距离首字符为i的字符,i可以是任意数,即使超过了数组范围。

注意:当我们定义了一个string类型之后,用printf("%s",s1);输出是会出问题的。这是因为“%s”要求后面的对象的首地址。但是string不是这样的一个类型。所以肯定出错。

用cout输出是没有问题的,若一定要printf输出。那么可以这样:printf("%s",s1.c_str());


【str-系列函数】

extern unsigned int strlen(char *s) 它从位置char*(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')。

char *strcpy(char* dest, const char *src)把从src地址开始且含有'\0'结束符的字符串复制到以dest开始的地址空间,返回值的类型为char*。

extern int strcmp(const char *s1,const char *s2)判断两个字符串s1和s2是否相同,相同返回true ,不同返回false.

【字符串与字符数组之间的相互转换】(易错)

这里只总结string型和char *型间的转换,其他的等价类比。

首先,char*型可以直接赋值给string型。char*指向一个内存地址,string会把该地址开始直至遇到'\0'的所有

字符作为自己的内容。(注意尽量不要使这一段内存出现没有初始化的部分,并且保证有'\0',否则虽然能赋值成功,

却会是乱码!)

但是,string型不能赋值给char *型,因为char*仅仅是个指针。

string结构本身提供了三个函数用于将值复制到char*所指的内存上。分别是:(设已有string str;)

str.data()

str.c_str()

两者用法相同,但返回的是常数指针。举例:

string str=“world”;
const char *p1 = str.c_str();
const char *p2 = str.data();

copy(p,n,size_type _Off = 0)从string类型对象中至多复制n个字符到字符指针p指向的空间中。默认从首字符

开始,但是也可以指定,开始的位置(记住从0开始)。返回真正从对象中复制的字符。用户要确保p指向的空间

足够保存n个字符

当然,也可以直接用循环赋值的方法,直接把str[i]赋值给char[i]即可。




猜你喜欢

转载自blog.csdn.net/sinat_38972110/article/details/80004846