目录结构:

contents structure [-]

标准库类型string表示可变长的字符序列,使用string类型必须首先包含string头文件,作为标准库的一部分string定义在标准库std中。

#include <string>//引用头文件
using std::string;

1.定义和初始化string

如何初始化类由类本身决定,一个类可以定义多种初始化对象的方式。

string s1;//默认初始化
string s2(s1);//s2是s1的副本
string s2 = s1;//等价于s2(s1),s2是s1的副本
string s3("value");//s3是字面值"value"的副本,除了字面值最后的那个空字符外
string s3 = "value";//等价于s3("value"),s3是字面值"value"的副本
string s4(n,'c');//把s4初始化为由连续n个字符'c'组成的串

2.string对象上的操作

一个类除了要规定初始化其对象的方式外,还要定义对象上所能执行的操作。下面是string对象的大多数操作。

os << s //将s写到输出流os当中,返回os
is >> s //从输入流is中读取字符串赋给s,字符串以空白分割,返回is
getline(is,s) //从is中读取一行赋给s,返回is
s.empty() //s为空返回true否则返回false
s.size() //返回s中字符的个数
s[n] //返回s中第n个字符的引用,位置n从0开始
s1+s2 //返回字符串s1和s2连接后的结果
s1=s2 //用s2的副本代替s1中原来的字符
s1==s2 //如果字符串s1和字符串s2中的字符完全一样,则返回true,否则为false
s1!=s2 //如果字符串s1和字符串s2中的字符不一样,则返回true,否则返回false
<,<=,>,>= //利用字符在字典中的顺序进行比较,且对字母的大小写敏感

下面的案例展示部分方法的使用,案例:

#include <iostream>
#include <string>
using namespace std; int main(){
string s;
cout << "请输入: \n";
cin >> s;//注意:这里以空格分隔,如果想读取整行数据,可以使用getline方法 cout << "你的输入是: \n";
cout << s << endl; s = "abc";
if(s.empty())
cout << "s是空\n";
else
cout << "s非空\n"; auto size = s.size();//size()函数的返回值是size_type类型,一种无符号整数类型
cout << "s size is: " << size << "\n"; //使用迭代器循环输出每个字符
for(auto a = begin(s); a!=end(s); a++){
cout << *a << " ";
}
//使用指针循环输出每个字符
for(char *c = &s[], c!=&s[s.size()]; c++){
cout << *c << " ";
}
cout << endl;
return ;
}

begin()返回指向首元素的迭代器,end()返回指向尾元素下一元素的迭代器。

由于字符串的size()方法的返回值是size_type类型,一种无符号整数类型,所以如果n是一个负数,那么下面的例子总是成立的s.size() < n,因为n会自动转化为一个较大的无符号值。因此需要判断字符串的大小,应该先把s.size()的类型转化为有符号的整形,然后再和n比较。例如:

#include <string>
#include <iostream>
using namespace std; int main(){
string s("abc");
int n = -;
cout << (s.size() < n) << "\n";//比较失败 int size = s.size();//先将size_type转化为有符号类型
n = -;
cout << (size < n) << "\n";//比较成功
cout << endl; return ;
}

输出结果为:


-10是有符号整形,在和无符号整形比较时候,会自动转化为一个较大的无符号整形(只有负数才会发生转化,正数不会发生)。所以正确的思路应该是,先把无符号整形转化为有符号整形,然后再比较。或是两个都是无符号整形。

3.处理string对象中的字符

在<cctype>头文件中,定义了一系列的标准字符处理函数。<cctype>是C语言头文件ctype.h的版本。
下面列举了一些主要函数:

isalnum(c)//当c是字母或数字时为真
isalpha(c)//当c是字母时为真
isdigit(c)//当c是数字时为真
ispunct(c)//当c是标点符号时为真
isspace(c)//当c是空格时为真
islower(c)//当c是小写字母时为真
isupper(c)//当c是大写字母时为真
tolower(c)//将c转化为小写字母
toupper(c)//将c转化为大写字母

案例:

#include <string>
#include <cctype>
#include <iostream>
using namespace std; int main(){
string str("abc");
for(auto a : str){
cout << a << endl;
}
for(auto &a : str){
a = toupper(a);//转化为大写
}
for(char *c=&str[]; c!=&str[str.size()]; c++){
cout << *c << endl;
}
return ;
}

4.C风格字符串

字符串字面值是一种通用结构的实例,这种结构是从c继承而来的C风格字符串(C-style character string),c风格字符串不是一种类型,而是一种约定俗成的写法,按照书写习惯,一般以空字符结束(null terminated),以空字符结尾的意思就是在字符串的最后一个字符后面加上'\0',一般利用指针来操作这些字符串。

同时在c++中的<cstring>头文件中,cstring是C语言头文件string.h的C++版本。

strlen(p) //返回p的长度,空字符不计算在内
strcmp(p1,p2) //比较p1和p2的相等性,如果p1==p2,那么返回0。如果p1>p2,那么返回一个正值。如果p1<p2,那么返回一个负值。
strcat(p1,p2) //将p2附加到p1后,返回p1
strcpy(p1,p2) //将p2拷贝给p1,返回p1

在用数组的形式初始化字符数组时,一定要以空字符‘\0’结尾。在使用字符串初始化字符数组时,会自动在末尾加上空字符'\0'。同时,<cstring>标准库中的方法,都是空字符结尾作为字符结尾的标志,如果未加空字符结尾,那么可能发生意想不到的结果。

char ch[] = {'C','+','+','\0'};//这里要以空字符结束
cout << strlen(ch) << endl;//
char ch2[] = "C++";//当把字符串赋值给char[]时,会自动在末尾添加\0 for(char *c=ch2; *c!='\0'; c++){
cout << *c << " ";
}

字符数组在使用他的名称的时候,编译器会在不同的位置给他编译成不同的类型。
例如:

#include <iostream>
#include <string>
#include <cctype>
using namespace std; int main(){
char c[] = {'c','+','+','\0'};
for(char *ch=c; *ch!='\0';ch++)//这里将c编译成首元素的地址
cout << *ch << endl; cout << c << endl;//这里输出数组中的所有元素 int i[]={,};
cout << i << endl; string s[] = {"a","bc"};
cout << s << endl; return ;
}

输入结果:

c
+
+
c++
0x7ffc37de8200
0x7ffc37de81c0

从结果中可以看出,当单独使用字符数组名称时,它会遍历其中的所有字符。当和指针联合使用时,它会返回首元素的指针。然而其他的数组(int[],string[])都没有这个特性。

除了上面的写法,还可能会看到下面的这种写法(让一个char指针指向一个字符串字面值常量,不是string):

char *cp = "c++";//等同于char *cp = "c++\0";

这种情况下,cp是一个字符指针。而且在单独使用cp的时候,也会遍历他的所有字符。当使用*cp时代表指向字符的首元素。
可以使用如下的方式遍历:

for(char *p = cp; *p!="\0"; p++)//注意这里是双引号"\0",不是单引号
cout << *p << endl;

如何把一个string转化为char[]数据

可以使用strcpy,copy来实现:

#include <iostream>/*cout*/
#include <string>/*string*/
#include <cstring>/*strcpy*/
int main()
{
std::string s = "Hello World!";
char *cstr = new char[s.size() + ];
strcpy_s(cstr,strlen(cstr),&s[]);
   //strcpy(cstr, s.c_str()); // 或者传递 &s[0] std::cout << cstr << '\n';
delete cstr;
return ;
}

【C++】C++中的字符和字符串的更多相关文章

  1. 已知一个字符串S 以及长度为n的字符数组a,编写一个函数,统计a中每个字符在字符串中的出现次数

    import java.util.Scanner; /** * @author:(LiberHome) * @date:Created in 2019/3/6 21:04 * @description ...

  2. C语言中的字符和字符串

    C语言在中常常出现字符和字符串,而一串字符或者字符串其实就是数组 字符数组的定义 char arr[]={'h','e','l','l','o','\0'}; 而定义字符串: char arr1[]= ...

  3. 《Python CookBook2》 第一章 文本 - 检查字符串中是否包含某字符集合中的字符 && 简化字符串的translate方法的使用

    检查字符串中是否包含某字符集合中的字符  任务: 检查字符串中是否出现了某个字符集合中的字符 解决方案: 方案一: import itertools def containAny(seq,aset): ...

  4. sql server中的charindex函数用法解析(在一段字符中搜索字符或者字符串-----返回expression1在expression2出现的位置;反之,返回0)

    https://blog.csdn.net/xinghuo0007/article/details/70651358 知识点一:charindex()语法 CHARINDEX ( expression ...

  5. mfc 中unicode 字符和字符串的使用

    在MFC或SDK程序中,不需要进行任何关于unicode的设置,记住下面两个宏,保你程序一路畅通: 用TCHAR/TCHAR*代替char/char* 及wchar/wchar*用TEXT(" ...

  6. java中的字符,字符串,数字之间的转换

    string 和int之间的转换 string转换成int  :Integer.valueOf("12") int转换成string : String.valueOf(12) ch ...

  7. java中的字符、字符串及数字之间的转换(转)

    一.string 和int之间的转换 1.string转换成int  :Integer.valueOf("12") 2.int转换成string : String.valueOf( ...

  8. c语言中的字符数组与字符串

    1.字符数组的定义与初始化 字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素. char str[10]={ 'I',' ','a','m',' ',‘h’,'a','p','p','y ...

  9. C/C++中经常使用的字符串处理函数和内存字符串函数

    一.            字符处理函数 1.        字符处理函数:<ctype.h> int isdigit(int ch) ;//是否为数字,即ch是否是0-9中的字符 int ...

随机推荐

  1. HDU 6119 小小粉丝度度熊 (区间去重)【尺取】

    <题目链接> 度度熊决定每天都在星星小姐的贴吧里面签到. 但是度度熊是一个非常健忘的孩子,总有那么几天,度度熊忘记签到,于是就断掉了他的连续签到. 不过度度熊并不是非常悲伤,因为他有m张补 ...

  2. ACM-ICPC 2018 南京赛区网络预赛 L 【分层图最短路】

    <题目链接> 题目大意: 有N个城市,这些城市之间有M条有向边,每条边有权值,能够选择K条边 边权置为0,求1到N的最短距离. 解题分析: 分层图最短路模板题,将该图看成 K+1 层图,然 ...

  3. Python import错误

    今天将一个文件命名为select,在其中import了  A文件 再然后发现 B文件import A文件,会将select也一起运行. 还出现的问题是 A中的类实例的时候说找不到. 最后想到selec ...

  4. C#Windows窗体界面设计_05_添加菜单栏 工具栏 状态栏 按钮

  5. DataGridView修改数据并传到数据库

    1. 两个属性设置: 第一个:设置自动创建列,默认为True DataGridView1. AutoGenerateColumns = True; 虽然默认为True,但写下去总是好的!!! 第二个: ...

  6. IE和DOM事件流

    * ie采用冒泡型事件 Netscape使用捕获型事件 dom使用先冒泡后捕获事件 冒泡型事件模型: button->div->body (IE事件流) 捕获型事件模型: body-> ...

  7. [AHOI2009]维护序列

    OJ题号:洛谷2023.BZOJ1798 思路: 参见[洛谷3373][模板]线段树 2 #include<cstdio> #include<cctype> #include& ...

  8. BZOJ3877 : [Ahoi2014&Jsoi2014]保龄球

    考虑从前往后放所有轮. 如果上一轮是全中: 那么这一轮如果是补中,一定放第一次最小的,这样可以让第一次大的放在其它补中之后. 如果这一轮是失误,那么一定放总分最大的. 如果上一轮是补中: 这一轮一定放 ...

  9. centos7下安装配置redis

    1.1. Redis下载安装(linux) 1.1.1. 下载: 下载地址:https://redis.io/download 选择合适的版本下载,如下图: 1.1.2. 安装: (1)把下载好的re ...

  10. Mac下hadoop运行word count的坑

    Mac下hadoop运行word count的坑 Word count体现了Map Reduce的经典思想,是分布式计算中中的hello world.然而博主很幸运地遇到了Mac下特有的问题Mkdir ...