C++字符串【string】和【char []】操作全攻略

异想之旅:本人原创博客完全手敲,绝对非搬运,全网不可能有重复;本人无团队,仅为技术爱好者进行分享,所有内容不牵扯广告。本人所有文章仅在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字,你看到这里难道还不准备给个三连吗!

  • 29
    点赞
  • 107
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
引用中提到,可以将一个char数组转为string。具体的方法是将char数组赋值给一个string变量。例如,char数组ch[20]中存储了字符串"abcdef",可以通过str=ch;将其转为string类型的str变量。 引用中提到,同样可以将char指针转为string类型。具体的方法是将char指针赋值给一个string变量。例如,char* a指向字符串"abcdef",可以通过b=a;或者b = string(a);将其转为string类型的b变量。 引用中提到,可以将一个char指针转为char数组。具体的方法是使用strcpy函数将char指针复制给一个char数组。例如,char* s指向字符串"abcdef",可以通过strcpy(ch, s);将其转为char数组ch。 所以,通过上述方法,可以在stringchar之间进行转换。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [stringchar 常用操作](https://blog.csdn.net/yt1242228309/article/details/124853597)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [【stringcharC++stringchar](https://blog.csdn.net/qq_42127861/article/details/120230040)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

异想之旅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值