异想之旅:本人博客完全手敲,绝对非搬运,全网不可能有重复;本人无团队,仅为技术爱好者进行分享,所有内容不牵扯广告。本人所有文章发布平台为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. FastDFS是使用c语言编写的开源高性能分布式文件系统

    FastDFS是什么 FastDFS是使用c语言编写的开源高性能分布式文件系统 是由淘宝开发平台部资深架构师余庆开发,FastDFS孵化平台板块 他对文件进行管理,功能包括文件存储,文件同步,文件访问 ...

  2. 第一篇 -- 安装和配置PyQt5

    我的电脑环境是:Win10 + Python3.6.4 + JetBrains PyCharm 2017.3.2 x64 之前用tkinter写界面,现在学习如何用PyQt5写界面. 安装PyQt5: ...

  3. 使用adb如何批量给设备安装apk

    win系统 1.首先我们需要在本地建一个文件夹apks,然后把所要安装的apk放进去 2.打开dos窗口使用for循环进行安装即可(前提你的电脑已经连接上了设备,输入adb devices可查看) f ...

  4. ifix 自动化(Automation)错误弹窗的解决方案

    在先前ifix项目中添加了语音模块,然后概率性跳出自动化(Automation)错误弹窗,先前分析了很多种原因,从代码的冗余,编码等角度进行了优化,效果不是很理想,仍然会概率性出现.经过反反复复大约3 ...

  5. python代码下载m3u8视频

    代码如下: # -*- coding: utf-8 -*- import requests import re import os import base64 from Crypto.Cipher i ...

  6. [CISCN2019 华北赛区 Day2 Web1]Hack World(二分法写布尔注入脚本)

    记一道布尔注入的题,存在过滤字符. 从题目看应该是一道注入题.提示存在flag表flag列. 输入1和2的返回结果不一样,可能是布尔注入. 简单用万能密码尝试了一下.提示SQL Injection C ...

  7. CTF_论剑场-web26

    is_numeric() 函数用于检测变量是否为数字或数字字符串.如果指定的变量是数字和数字字符串则返回 TRUE,否则返回 FALSE isset() - 检测变量是否设置. $str进行正则表达式 ...

  8. 100的累加和 while 循环

    //100的累加和 while 循环 #include <stdio.h> int main() { int sum = 0; //5050 int i = 0; while(i < ...

  9. 『Java』数组

    在学习数组之前先学习java.util.Arrays类中的一个静态方法Arrays.toString(). 该方法可以将传入的数组格式化为一个字符串,便于我们查看数组内容,例如: import jav ...

  10. 关于表单重复提交之验证码 和谷歌Kaptcha图片验证码的使用

    表单重复提交之-----验证码 表单重复提交有三种常见的情况: 一:提交完表单.服务器使用请求转来进行页面跳转.这个时候,用户按下功能键 F5,就会发起最后一次的请求. 造成表单重复提交问题.解决方法 ...