异想之旅:本人博客完全手敲,绝对非搬运,全网不可能有重复;本人无团队,仅为技术爱好者进行分享,所有内容不牵扯广告。本人所有文章发布平台为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. POJ3190 - 优先队列 贪心

    POJ3190 将所有牛从小到大排序然后用优先队列(小根堆)依次记录插入的牛的结束时间,如果插入牛时起始时间大于首元素,ans不增加并弹出首元素. 挺简单的.那么为什么我会写(水)这篇博客呢? #in ...

  2. [考试总结]noip模拟13

    因为最近考试频繁,所以咕掉了好长时间... 淦,刚说完又来一场... 先咕了,等以后有时间再写.... 回来了... 首先看到这个题目们,感觉就不存好意... 然后开始开 \(T1\). 只能蒻蒻地按 ...

  3. Python基础之读取ini文件

    基本使用方法 第一步:准备一份INI文件.如test1.ini [ITEMS] item1=1 item2=2 item3=3 item4=4 [ITEM1] test1=aaa [ITEM2] te ...

  4. java封装基础详解

    java封装基础详解 java的封装性即是信息隐藏,把对象的属性和行为结合成一个相同的独立单体,并尽可能地隐藏对象的内部细节. 封装的特性是对属性来讲的. 封装的目标就是要实现软件部件的"高 ...

  5. IDEA创建Mapper.xml文件识别不成功的问题

    在IDEA的maven项目中,创建一个EmpMapper.xml的文件识别不成功,图标显示为文本文档类型,在写代码时也不会弹出提示 解决方法: 在文件->设置->编辑器->文件类型中 ...

  6. 桌面小部件AppWidgetProvider简单分析

    1.一般桌面小部件涉及到的类 AppWidgetProvider :BroadcastRecevier子类,用于接收更新,删除通知 AppWidgetProvderInfo:AppWidget相关信息 ...

  7. 树莓派压力测试工具S-Tui + Stress的使用

    压力测试工具S-Tui + Stress的使用 树莓派# 背景故事 打算测试一下树莓派外壳的散热性能,需要能压满CPU100%,同时显示温度.CPU频率.CPU占用率,那么这款工具你值得拥有. 软件介 ...

  8. Java代码操作zookeeper

    .personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...

  9. java常见面试题目

    (面的初级到中级之间的,却有很多高级的问题) 总结一些常见的遇见的面试题(来自各方面收集) 1.开发中Java用了比较多的数据结构有哪些? 2.谈谈你对HashMap的理解,底层原理的基本实现,Has ...

  10. Golang语言系列-05-数组和切片

    数组和切片 数组 概念 数组是同一种数据类型元素的集合:数组的长度必须是常量,并且长度是数组类型的一部分,一旦定义,长度不能变 例如:[5]int 和 [10]int 是不同的数组类型 使用时可以修改 ...