异想之旅:本人博客完全手敲,绝对非搬运,全网不可能有重复;本人无团队,仅为技术爱好者进行分享,所有内容不牵扯广告。本人所有文章发布平台为CSDN、博客园、简书和开源中国,后期可能会有个人博客,除此之外全部是盗文!


一、char [] 类型

1. 定义与输入

1.1 定义时指定内容

#include <iostream>
using namespace std;
int main() {
char a[10] = "123";
cout << a; return 0;
} // 输出:123

此时程序自动在 a[3] 的位置写入了终止符 '\0'

#include <iostream>
using namespace std;
int main() {
char a[10];
a[0] = 'A';
a[2] = 'C';
cout << a; return 0;
} // 输出:A

char数组不赋值默认所有位置都是结束符 '\0' 。直接输出字符数组时,从起始地址开始,找到第一个结束符结束输出。

1.2 朴素cin

#include <iostream>
using namespace std;
int main() {
char a[3];
// 输入到第一个空格截止;需要保证将要获取的内容不多于a的长度否则溢出
cin >> a;
cout << a; return 0;
} // 输入1:123
// 输出1:123 // 输入2:123 456
// 输出2:123 // 输入3:123456
// 输出3:123456
// 此时数组发生了溢出!

严格来讲三个输入输出全部发生了数组溢出,因为前两个输入输出中 '\0' 也处于 a[3] 的位置

1.3 cin.get()

#include <iostream>
using namespace std;
int main() {
char a[3];
cin.get(a, sizeof(a)); // 第二个参数为a的长度
cout << a; return 0;
} // 输入:12345
// 输出:12

第6行 cin.get() 中的第二个参数限定了输入的最大长度:最大长度实际为传入的数字减一,因为a的最后一个位置需要存放 '\0'

如果在未达到最大长度限制时出现空格,则输入从行开始读取到第一个空格结束。

1.4 cin.getline()

#include <iostream>
using namespace std;
int main() {
char a[5];
cin.getline(a, sizeof(a)); // 第二个参数为a的长度
cout << a; return 0;
} // 输入:1 2345
// 输出:1 23

与上方 cin.get() 的用法和意义完全相同,唯一区别是空格不会作为输入结束的条件

1.5 gets()

从此处开始程序需要包含头文件 stringstring.hcstring

#include <cstring>
#include <iostream>
using namespace std;
int main() {
char a[5];
gets(a);
cout << a; return 0;
}
// 输入:1 2 3
// 输出:1 2 3

cin.getline() 唯一的不同就是不限制最大字符数,需要自行确认输入数据小于数组最大限制。越界有风险,偷懒需谨慎!

1.6 对于1.3~1.5的警告内容

注意: 对于先输入数字再输入字符串并使用 cin.get()cin.getline()gets() 方式时,程序会先读取当前行剩余部分(有可能只有一个回车符),而不会读取新的一行。若数字和字符串在同一行,则中间的空格也将作为字符串的一部分。

具体请看样例

程序 1

#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
char a[3];
gets(a);
cout << a;
return 0;
}

输入 1-1

10 abc
def

输出 1-1(开头有一个空格)

 abc

输入 1-2

10
abcdef

输出 1-2

(空)

解决方案如下

程序 2

#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
char a[3];
gets(a);
gets(a);
cout << a;
return 0;
}

输入 2-1

10 abc
def

输出 2-1(开头有一个空格)

def

输入 2-1

10
abcdef

输出 2-1

abcdef

2. 基本操作

这部分所有代码都需要string相关头文件,使用1.2介绍的朴素cin方式输入

2.1 获取长度

#include <cstring>
#include <iostream>
using namespace std;
int main() {
char a[5];
cin >> a;
cout << strlen(a); return 0;
} // 输入:123
// 输出:3

2.2 字符串复制

#include <cstring>
#include <iostream>
using namespace std;
int main() {
char a[5], b[5];
cin >> a;
strcpy(b, a);
cout << b; return 0;
} // 输入:12345
// 输出:12345

2.3 字符串比较

#include <cstring>
#include <iostream>
using namespace std;
int main() {
char a[5], b[5];
cin >> a >> b;
cout << bool(a > b); return 0;
} // 输入:ef abcd
// 输出:1

比较的是字典序,字典序的解释如下:

设想一本英语字典里的单词,何者在前何者在后? 显然的做法是先按照第一个字母、以 a、b、c……z 的顺序排列;如果第一个字母一样,那么比较第二个、第三个乃至后面的字母。如果比到最后两个单词不一样长(比如,sigh 和 sight),那么把短者排在前。

2.4 字符串连接

#include <cstring>
#include <iostream>
using namespace std;
int main() {
char a[20], b[6];
cin >> a >> b; // 别忘了朴素cin会以空格作为结束符
strcat(a, b);
cout << a; return 0;
} // 输入:Hello World
// 输出:HelloWorld

对于 strcpy()strcat() 参数顺序如果不好记的话,就想着前面的是被改变的,后面的是不变的

2.5 字符串搜索

#include <cstring>
#include <iostream>
using namespace std;
int main() {
char a[20], b[6];
cin >> a >> b;
cout << strstr(a, b) - a; return 0;
} // 输入:ababcab abc
// 输出:2

strstr(a, b) 返回的是一个指向a中首次出现b的地址的指针。此处我们为了将地址转换为a数组的索引所以再减去一下a的初始地址。

二、string类

1. 定义与输入

1.1 定义时指定内容

#include <iostream>
using namespace std;
int main() {
string a = "123";
cout << a; return 0;
} // 输出:123

此时程序自动在 a[3] 的位置写入了终止符 '\0'

与char数组不同,string类型不可以直接通过索引位置定义

#include <iostream>
using namespace std;
int main() {
string a;
a[0] = 'A';
cout << a; return 0;
} // 输出:(空)

但是通过索引进行修改是合法的:

#include <iostream>
using namespace std;
int main() {
string a = "ABC";
a[0] = 'a';
cout << a; return 0;
} // 输出:aBC

1.2 朴素cin

#include <iostream>
using namespace std;
int main() {
string a;
// 输入到第一个空格截止
cin >> a;
cout << a; return 0;
} // 输入1:123
// 输出1:123 // 输入2:123 456
// 输出2:123 // 输入3:123456
// 输出3:123456

输入同样是从开始到第一个空格,但是与char数组不同的是,string类不会越界或溢出!

1.3 getline()

#include <iostream>
using namespace std;
int main() {
char a[3];
cin.get(a, sizeof(a)); // 第二个参数为a的长度
cout << a; return 0;
} // 输入:12345
// 输出:12

cin.get()cin.getline()gets() 对string不适用

注意:若输入数据一行数字一行字符串直接使用 getline() 会导致读取不到数据,解决方案类似第一部分的1.6

2. 基本操作

这部分所有代码使用1.2介绍的朴素cin方式输入

2.1 获取长度

#include <iostream>
using namespace std;
int main() {
string a;
cin >> a;
cout << a.length();
// cout << a.size(); // 等价 return 0;
} // 输入:123
// 输出:3

2.2 字符串复制

#include <iostream>
using namespace std;
int main() {
string a, b;
cin >> a;
b = a;
cout << b; return 0;
} // 输入:12345
// 输出:12345

真的不能再简单了

2.3 字符串比较

#include <iostream>
using namespace std;
int main() {
string a, b;
cin >> a >> b;
cout << bool(a > b); return 0;
} // 输入:ef abcd
// 输出:1

比较的是字典序,字典序的解释如下:

设想一本英语字典里的单词,何者在前何者在后? 显然的做法是先按照第一个字母、以 a、b、c……z 的顺序排列;如果第一个字母一样,那么比较第二个、第三个乃至后面的字母。如果比到最后两个单词不一样长(比如,sigh 和 sight),那么把短者排在前。

2.4 字符串连接

#include <iostream>
using namespace std;
int main() {
string a, b;
cin >> a >> b;
cout << a + b; return 0;
} // 输入:Hello World
// 输出:HelloWorld

嗯,非常Python风格……

2.5 字符串搜索

#include <iostream>
using namespace std;
int main() {
string a, b;
cin >> a >> b;
cout << a.find(b); return 0;
} // 输入:ababcab abc
// 输出:2

输出是a中首次出现b的索引

三、char [] 与 string 相互转换

1. string 转 char []

#include <string.h>
#include <iostream>
using namespace std;
int main() {
string s = "123.123";
char a[101];
strcpy(a, s.c_str());
// strcpy(a, s.data()); // 与上方语句等价,任选其一即可
cout << a << endl; return 0;
}

2. char [] 转 string

#include <bits stdc++.h="">
using namespace std;
int main() {
char a[100] = "123.123";
string s = a;
cout << s;
return 0;
}

四、char [] 与 string 转换为数值类型(2021.8.28添加)

这个内容还烦请移步我的另一篇文章 C++中【字符串】与【整型】和【浮点型】转换全攻略!_异想之旅的博客-CSDN博客


手写5000字,你看到这里难道还不准备给个三连吗!</string.h>

C++字符串【string】和【char []】操作全攻略的更多相关文章

  1. [Perl]Windows 系统 Unicode 文件名操作(新建、重命名、枚举、复制)全攻略

    [Perl] Windows 系统 Unicode 文件名操作(新建.重命名.枚举.复制)全攻略 环境 XP/WIN7 Perl v5.16 编辑整理:PerlMonk.523066680 常见的那些 ...

  2. webBrowser中操作网页元素全攻略

    原文 webBrowser中操作网页元素全攻略 1.获取非input控件的值: webBrowser1.Document.All["控件ID"].InnerText; 或webBr ...

  3. Moon.Orm3.8技术全攻略

    Moon.ORM技术全攻略  一.绪论 本文主要是针对Moon.ORM的技术的讨论及其使用使用指导.如有其它疑问,请留言.本文主要针对Moon.ORM3.9版本,同时将会对4.0做一个技术预览.本文从 ...

  4. Android使用XML全攻略(1)

    Android使用XML全攻略(1)    Android 是针对移动设备的一种新兴的开源操作系统和 SDK.借助它,您可以创建功能强大的移动应用程序.当您的应用程序可以访问 Web 服务时,其吸引力 ...

  5. VSCode插件开发全攻略(七)WebView

    更多文章请戳VSCode插件开发全攻略系列目录导航. 什么是Webview 大家都知道,整个VSCode编辑器就是一张大的网页,其实,我们还可以在Visual Studio Code中创建完全自定义的 ...

  6. 用C#制作PDF文件全攻略

    用C#制作PDF文件全攻略 目  录 前    言... 3 第一部分 iText的简单应用... 4 第一章 创建一个Document 4 第一步 创建一个Document实例:... 5 第二步 ...

  7. 在net安装程序中部署oracle客户端全攻略

    在net安装程序中部署oracle客户端全攻略 主要的是要做三件工作: 打包文件,写注册表,注册环境变量说明:我的oracle版本为9, 在2000 advanced server 上测试通过,可以正 ...

  8. 【转】Perl Unicode全攻略

    Perl Unicode全攻略 耐心看完本文,相信你今后在unicode处理上不会再有什么问题. 本文内容适用于perl 5.8及其以上版本. perl internal form 在Perl看来, ...

  9. Android使用XML全攻略(2)

    Android使用XML全攻略(2)   Android 是针对移动设备的一种新兴的开源操作系统和 SDK.借助它,您可以创建功能强大的移动应用程序.当您的应用程序可以访问 Web 服务时,其吸引力会 ...

随机推荐

  1. 【LeetCode】203.移除链表元素

    203.移除链表元素 知识点:链表:双指针 题目描述 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 . 示例 ...

  2. height设置100%不起作用

    详细讲解了原因:http://www.webhek.com/post/css-100-percent-height.html

  3. 单细胞分析实录(19): 基于CellPhoneDB的细胞通讯分析及可视化 (下篇)

    在上一篇帖子中,我介绍了CellPhoneDB的原理.实际操作,以及一些值得注意的地方.这一篇继续细胞通讯分析的可视化. 公众号后台回复20210723获取本次演示的测试数据,以及主要的可视化代码. ...

  4. PAT甲级:1025 PAT Ranking (25分)

    PAT甲级:1025 PAT Ranking (25分) 题干 Programming Ability Test (PAT) is organized by the College of Comput ...

  5. 微信小程序账号注册

    想要开发微信小程序,先注册账号申请APPID. 第一步:百度搜索"微信公众平台" 第二步:立即注册 进入注册页面 区别: 订阅号: 订阅号在文件夹里,订阅号消息 一天只能推送一次, ...

  6. Querydsl与SpringBoot集成

    Querydsl为大多数数据库提供了一种基于Java的类型安全,类SQL的查询方式.相比JPA,Querydsl能提供更加强大的查询方式,比如关联查询.相比MyBatis,Querydsl省去了XML ...

  7. FreeRTOS-04-内核控制函数+时间管理函数

    说明 本文仅作为学习FreeRTOS的记录文档,作为初学者肯定很多理解不对甚至错误的地方,望网友指正. FreeRTOS是一个RTOS(实时操作系统)系统,支持抢占式.合作式和时间片调度.适用于微处理 ...

  8. C++ //深拷贝与浅拷贝 //浅拷贝 : 简单的赋值拷贝操作 //深拷贝: 在堆区重新申请空间 进行拷贝操作

    1 //深拷贝与浅拷贝 2 3 //浅拷贝 : 简单的赋值拷贝操作 4 //深拷贝: 在堆区重新申请空间 进行拷贝操作 5 6 7 #include <iostream> 8 using ...

  9. 35岁Android程序员被阿里辞退,生活压力太大痛哭,中年危机如何自救?

    多数人都喜欢安逸的生活,尤其是随着年龄的增长,很多人都希望工作和生活趋于稳定,不愿意再让生活有很大的变动.可是,当达到一定的年龄时,危机还是存在的. 之前有一位阿里员工在脉脉上,晒出了自己被辞退的经历 ...

  10. Lock(锁)

    Lock(锁) 从JDK 5.0开始,Java提供了更加强大的线程同步机制----通过显示定义同步锁对象来实现同步.同步锁使用Lock对象充当. java.util.concurrent.locks. ...