#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 newStr=oldStr.substr(初始序号,长度);
【字符串与字符数组之间的相互转换】(易错) char *c=&str[0]
这里只总结string型和char *型间的转换,其他的等价类比。
首先,char*型可以直接赋值给string型。char*指向一个内存地址,string会把该地址开始直至遇到'\0'的所有
字符作为自己的内容。(注意尽量不要使这一段内存出现没有初始化的部分,并且保证有'\0',否则虽然能赋值成功,
却会是乱码!)
但是,string型不能赋值给char *型,因为char*仅仅是个指针。
string是类,可以把它的头指针传给char*,即 char *c=&str[0].
比如,要将string型的一串数字str转换成整数,则用
int n=atoi(&str[0]);
该功能也可以直接由 int n=stoi(str); 实现。
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]即可。
【其他类型转字符串】(以整型为例)
string to_string(int n);