C++字符串【string】和【char []】操作全攻略
一、char [] 类型1. 定义与输入1.1 定义时指定内容#include <iostream>using namespace std;int main() {char a[10] = "123";cout << a;return 0;}// 输出:123此时程序自动在 a[3] 的位置写入了终止符 '\0'1.2 朴素cin#include <iostream&
异想之旅:本人原创博客完全手敲,绝对非搬运,全网不可能有重复;本人无团队,仅为技术爱好者进行分享,所有内容不牵扯广告。本人所有文章仅在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'
如果读完一行还没到达限定大小, cin.get()
会保留最后的回车符,这导致连用两个 cin.get
会导致第二个无法读取数据(感谢 C+±基础语法-cin.getline() 与 cin.get() 的区别,以及getline()函数使用方法_shangyj17的博客-CSDN博客_cin.get和cin.getline的区别 提供的资料)!
因此连用时请这样操作以消除行尾换行:
char a[10], b[10];
// 错误操作
cin.get(a, sizeof(a));
cin.get(b, sizeof(b));
// 正确操作
cin.get(a, sizeof(a));
cin.get();
cin.get(b, sizeof(b));
所以同一行的多个读入操作还是要朴素cin好, cin.get()
不会在空格处停下
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()
注意! 新版本C++规范已经删除这一函数,CCF系列竞赛也不再支持,不要再用了!
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() {
string a;
getline(cin, a);
cout << a;
return 0;
}
// 输入:12345
// 输出:12345
cin.get()
、 cin.getline()
和 gets()
对string不适用
getline()
函数有返回值,因此可以在不知道数据组数的情况下放到while循环的条件中使用(仅限 freopen()
读取文件时)
注意:若输入数据一行数字一行字符串直接使用 getline()
会导致读取不到数据,解决方案类似第一部分的1.6
2. 基本操作
这部分所有代码使用2.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字,你看到这里难道还不准备给个三连吗!
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)