目录结构:

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. XX-Net的局域网共享代理方法

    局域网内有一台电脑安装了XX-net,将其共享给局域网内其他电脑,让其他电脑经这台电脑的XX-net配置访问网站. 一.电脑端操作1.在XXnet/data/gae_proxy目录下修改config. ...

  2. POJ 2418 Hardwood Species 【Trie树】

    <题目链接> 题目大意: 给你一堆字符串,让你按字典序输出他们出现的频率. 解题分析: 首先,这是Trie数词频统计的题目,以Trie树的边储存字母,节点存储以该节点结尾的链所代表的字符串 ...

  3. 001. Ansible简介

    一 简介 Ansible是一款极其简单的自动化运维工具, 基于Python开发, 集合了众多运维工具(puppet, cfengine, chef, func, fabric)的优点. 实现了批量系统 ...

  4. myBatis之Clob & Blob

    1. 表结构 1.1 在Mysql中的数据类型,longblob  -->  blob, longtext --> clob 2. 配置文件, 请参考  myBatis之入门示例 3. L ...

  5. 使用Actuator监控

    Actuator可能大家非常熟悉,它是springboot提供对应用自身监控,以及对应用系统配置查看等功能. springboot使用actuator的方式非常简单,只需要在项目中加入依赖spring ...

  6. XamarinAndroid组件教程RecylerView动画组件使用动画(3)

    XamarinAndroid组件教程RecylerView动画组件使用动画(3) (8)打开Main.axml文件,构建主界面.代码如下: <?xml version="1.0&quo ...

  7. emitted value instead of an instance of error the scope attribute for scoped slots webpack babel polyfill

    api20180803.vue emitted value instead of an instance of error the scope attribute for scoped slots h ...

  8. Android JNI 增强应用程序性能

    JNI全称Java Native Interface. 它为托管代码(使用Java编程语言编写)与本地代码(使用C/C++编写)提供了一种交互方式.它是与厂商无关的(vendor-neutral),支 ...

  9. 潭州课堂25班:Ph201805201 第一课:环境搭建 (课堂笔记)

    安装PyCharm ,Oracle VM VirtualBox,Xshell ,实现仿真远程连接服务器,其中Oracle VM VirtualBox用于那家linux服务器,Xshell 用于连接服务 ...

  10. equals()与hashCode()

    两个都可以用来判断两个对象是否相同一致. hashCode相同的不一定是同一个对象:hashCode不同的一定不是相同对象 equals相同的一定是相同对象,是绝对可靠的 既然equals这么可靠,那 ...