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

    scala操作外部数据 一.scala读取文件及网络数据 package top.ruandb.scala.Course08 import scala.io.Source object FileApp ...

  3. 使用deepin系统自带命令切割视频使用lossless免费软件切割

    1,使用ffmpeg命令:ffmpeg -ss 00:00:10 -i gaodengshuxue.mp4 -vcodec copy -acodec copy -t 00:00:20 output.m ...

  4. Javascript闭包解析----------------v客学院技术分享

    跟java,php等编程语言一样,javascript也采用词法作用域,简单的来说就是函数的执行依赖于变量的作用域,这个作用域是在函数定义时决定的,而不是函数调用时决定的.为了实现这种词法作用域,还必 ...

  5. Socket介绍(五)

    套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开.读写和关闭等操作.套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信.网络套接 ...

  6. Java字节码增强技术

    简单介绍下几种java字节码增强技术. ASM ASM是一个Java字节码操控框架,它能被用来动态生成类或者增强既有类的功能.ASM可以直接产生class文件,也可以在类被加载入Java虚拟机之前动态 ...

  7. [考试总结]noip模拟22

    又发现模拟 \(22\) 的总结也咕掉了,现在补上它... 似乎又是gg的一场. 以为自己的部分分数打的很全,然而到后面发现自己的树剖打假了 \(\color{green}{\huge{\text{树 ...

  8. C++第三十三篇 -- 研究一下Windows驱动开发(一)内部构造介绍

    因为工作原因,需要做一些与网卡有关的测试,其中涉及到了驱动这一块的知识,虽然程序可以运行,但是不搞清楚,心里总是不安,觉得没理解清楚.因此想看一下驱动开发.查了很多资料,看到有人推荐Windows驱动 ...

  9. ts 学习笔记 - 类

    目录 类 类的概念 类的用法 属性和方法 类的继承 存取器 静态属性 Typescript 中的用法 抽象类 类的类型 类与接口 类实现接口 接口继承接口 接口继承类 混合类型 类 类的概念 类 (c ...

  10. jvm源码解读--08 创建oop对象,将static静态变量放置在oop的96 offset处

    之前分析的已经加载的.Class文件中都没有Static 静态变量,所以也就没这部分的解析,自己也是不懂hotspot 将静态变量放哪里去了,追踪源码之后,看清楚了整个套路,总体上来说,可以举例来说对 ...