首页 > 其他分享 >字符串相关

字符串相关

时间:2024-05-08 13:33:21浏览次数:28  
标签:string cin char str 字符串 相关 cout

字符串相关

文章参考:

[详解-字符串] C++必知必会 字符串-string常用各种操作解析 - 知乎 (zhihu.com)

C++ 字符串(string)常用操作总结 - 知乎 (zhihu.com)

c++读取字符串和字符的6种函数_c++获取字符串的每个字符-CSDN博客

字符串使用大全(比较实用的):C++中的String的常用函数用法总结_string函数-CSDN博客

头文件

#include <string>

定义字符串

string str;

初始化字符串

string str = "32131";  // 输出32131
cout << str << endl;

获取字符串长度

1.使用length()函数

string str = "Hello World!";
//输出:12
cout << str.length() << endl;

2.使用字符串的size()函数

string str = "Hello World!";
//输出:12
cout << str.size() << endl;

3.使用C风格的字符串函数strlen()(需要包含cstring头文件)

#include<cstring>
const char* cstr = "Hello world!";
//输出:12
cout << strlen(cstr) << endl;

访问字符串元素

1.通过索引的下标从0到size() - 1

string str = "abcd1234";
//输出:abcd1234
for (int i = 0; i < str.size(); i++) { //这里使用str.length()也是可以的
    cout << str[i];
}
cout << endl;

2.通过迭代器访问字符串

①直接使用auto替代繁琐的类型声明:(推荐)

string str = "abcd1234";
// 输出:abcd1234
for(auto i : str)
{
    cout << it;
}
cout << endl;

②声明类型

string str = "abcd1234";
// 输出:abcd1234
for(string::iterator it = str.begin(); it != str.end(); it ++ )
{
	cout << *it;
}
cout << endl;

③或者用auto代替string,效果也是一样的

string str = "abcd1234";
//输出:abcd1234
for (auto it = str.begin(); it != str.end(); it++) {
    cout << *it;
}
cout << endl;

向字符串中插入元素

1.向字符串指定位置插入元素

string str = "abcdefg";
// 向字符串索引为3的位置插入 1234
str.insert(3, "1234"); // 以3这个位置为起始点,插入数据
// 输出:abc1234defg
cout << str << endl;

//向字符串索引为1的位置插入"A"
str.insert(1, "A");
//输出:aAbc1234defg
cout << str << endl;

2.向字符串开头插入元素

string str = "abcdefg";
//向字符串索引为0的位置插入"1234",就是在字符串的开头添加"1234"
str.insert(0, "1234");
//输出:1234abcdefg
cout << str << endl;

等价于要插入的字符串元素直接在前方与该字符串连接:

string str = "abcdefg";
str = "1234" + str;
//输出:1234abcdefg
cout << str << endl;

3.向字符串结尾插入元素

string str = "abcdefg";
//向字符串索引为str.size()的位置插入"1234",就是在字符串的末尾添加"1234"
str.insert(str.size(), "1234");
//输出:abcdefg1234
cout << str << endl;

等价于要插入的字符串元素直接在后方与该字符串连接:

string str = "abcdefg";
str = str + "1234"; //或者str += "1234";
//输出:abcdefg1234
cout << str << endl;

连接字符串

1.通过+连接字符串

string str = "abcdefg";
str = str + "1234"; //或者str += "1234";
//输出:abcdefg1234
cout << str << endl;

2.通过append()函数连接字符串

string str = "abcdefg";
str.append("1234");
//输出:abcdefg1234
cout << str << endl;

删除字符串中的元素:erase()函数

string str ="0123456789";
// //从索引为2的位置开始(包括2),删除3个字符
str.erase(2, 3);
// 输出:0156789
cout << str << endl;

string str = "0000123456789";
//从索引为0的位置开始(包括0),删除3个字符
str.erase(0, 3);
//输出:0123456789
cout << str << endl;

修改字符串中的元素

1.通过索引修改

string ste = "0123456789";
str[0] = 'a';
str[1] = 'b';
str[2] = 'c';
//输出:abc3456789
cout << str << endl;

2.通过replace()函数替换/修改

string str = "0123456789";
//替换str中从索引1(包括1)开始的3个字符为"abcde"
str.replace(1, "abcde");
// 输出:0abcde456789
cout << str << endl;

查找字符串中的元素/查找子串

1.find()函数

该函数从字符串的开头开始查找子串。

①如果能找到,返回子串第一个字符所在的索引:

string str = "Hello, world!";
// 查找子串的位置
int pos = str.find("world"); 
//输出:7
cout << pos << endl;

int pos1 = str.find("llo");
//输出:2
cout << pos1 << endl;

②如果找不到,返回-1,不会报错:

string str = "Hello, world!";
// 查找子串的位置
int pos = str.find("abc"); 
//输出:-1
cout << pos << endl;

2.rfind()函数

该函数从字符串的末尾开始查找子串。

①如果能找到,返回子串第一个字符所在的索引:

string str = "Hello, world!";
// 查找子串的位置
int pos = str.rfind("world"); 
//输出:7
cout << pos << endl;

int pos1 = str.rfind("llo");
//输出:2
cout << pos1 << endl;

②如果找不到,返回-1,不会报错:

string str = "Hello, world!";
// 查找子串的位置
int pos = str.rfind("abc"); 
//输出:-1
cout << pos << endl;

截取子串:substr()函数

string str = "0123456789";
//截取字符串从索引3开始的,长度为5的子串
string sub = str.substr(3, 5); 
//输出:34567
cout << sub << endl;

判断字符串是否为空:empty()函数

string str1 = "abc";
//输出:0,表示str1非空
cout << str1.empty() << endl;

string str2 = "";
//输出:1,表示str2为空串
cout << str2.empty() << endl;

字符串的比较

1.通过比较运算符来比较

string str1, str2;
str1 = "Hello";
str2 = "Hello";
//输出:1,表示两个字符串相等
cout << (str1 == str2) << endl;

str1 = "Hello";
str2 = "World";
//输出:1,表示表示str1小于str2
cout << (str1 < str2) << endl;


str1 = "abcd";
str2 = "ABCD";
//输出:1,表示str1大于str2
cout << (str1 > str2) << endl;

2.通过campare()函数来比较

返回0表示相等,负数表示str1小于str2,正数表示str1大于str2

string str1, str2;
str1 = "Hello";
str2 = "Hello";
//输出:0,表示两个字符串相等
cout << str1.compare(str2) << endl;

str1 = "Hello";
str2 = "World";
//输出:-1,表示表示str1小于str2
cout << str1.compare(str2) << endl;


str1 = "abcd";
str2 = "ABCD";
//输出:1,表示str1大于str2
cout << str1.compare(str2) << endl;

字符串转数字:stoi() / stof() / stod()函数

1.字符串转整数:stoi()函数

string str = "123";
int num = stoi(str);
// 输出:123
cout << num << endl;

2.字符串转浮点数:stof()函数

float floatNum = stof("3.14");
//输出:3.14
cout << floatNum << endl;

3.字符串转双精度浮点数:stod()函数

double doubleNum = stod("6.022e23");
//输出:6.022e+23
cout << doubleNum << endl;

字符串转换大小写

1.转换为大写:toupper()函数

string str = "Hello, World!";
for(char &ch : str)
{
	ch = toupper(ch); // 将字符串中的字符转换为大写形式
}
//输出:HELLO, WORLD!
cout << str << endl;

2.转换为小写:tolower()函数

string str = "HELLO, WORLD!";
for (char& ch : str) {
    ch = tolower(ch); // 将字符串中的字符转换为大写形式
}
//输出:hello, world!
cout << str << endl;

字符串读的各种操作

image-20240502144420002

scanf

scanf用于字符串数组,遇到空格或换行就停止

char str[10];
scanf("%s", str);
cout << str << endl;

getline()

可以接受空格,读取时遇到换行符结束

有两种读取方法,法一是string流,法二是iostream流,是两个不一样的函数

  • 使用string
string str;
geline(cin, str);
cout << str << endl;
  • 使用字符串数组
char str[100];
cin.getline(str, 20, '\n');
//cin.getline()里面三个参数,第一个是要储存的字符串数组,第二个是最大长度 + 1,最后一个位置用来存储'\0',也就是说你填20,但是只能存前19个字符,第三个是结束符,可省略,默认是换行符

注意⚠️
程序的输入都建有一个缓冲区,每次输入的过程,其实是计算机先将输入的数据存在输入缓冲区中,而我们使用的输入函数是直接从缓冲区中读取数据。使用cin的时候,遇到空格和换行符和tab键就会停止,此时缓冲区就会有残留数据:空格、换行符、tab。cin和cin.get()从缓冲区读入的时候会自动忽略第一个空格、换行符、tab,就可以正常读入字符串,但有些函数并不能,比如 getline,gets,get, 他们就会直接读取缓冲区剩余的空格、换行符、tab,就导致需要输入的输不进去。
所以如果你使用getline()或gets()或者cin.get()之前用了cin或cin.get(),请务必在cin后面加个getchar();

//法一
string s, ss;
cin>>s;
getchar();
getline(cin, ss);
cout<<ss<<endl;

//法二
string s;
char ss[20];
cin>>s;
getchar();
cin.getline(ss, 20);
cout<<ss;

get()

读取字符串时用法同getline()的第二种用法

与getline()的区别是cin.get()会将结束符或换行符残留在输入缓冲区中,而getline不会,所以使用get后如果还要用除cin外的输入函数,就得加一个getchar()

char s[100];
cin.get(s, 10);

读取字符时

char c;
c = cin.get();

还可以和getchar一样读走缓冲区中不要的字符

cin.get();

gets()

字符串数组

char s[10];
gets(s);

gets和getline一样,不会将结束符或换行符留在缓冲区,不过如果缓冲区有结束符或换行符,他也会读进去,所以在前面要加个getchar()

char s[10];
gets(s);
cout<<s<<endl;

也可以用于二维字符数组

char s[3][10];
    for(int i = 0; i < 3; ++i){
        gets(s[i]);
    }
    for(int i = 0; i < 3; ++i){
        cout<<s[i]<<endl;
    }

getchar()

getchar()会从缓冲区读走一个字符,如果输入多个字符,也只会读取第一个

char x = getchar();

个人小结:

  • 按整行读到string ,推荐用 方法2 getline(cin, string)
  • 按整行读到char[] ,推荐用 方法4 cin.getline(cin, char*)
  • 读单个字符串,推荐用 cin>>

啰嗦解释如下:

按行读
方法2 getline(cin, string) 和 方法4 cin.getline(cin, char) 会读到回车为止,并且会把回车丢弃。
方法3 cin.get(cin, char) 不丢弃回车

其他: fgets 会多读入一个回车,比较麻烦

读字符串
cin >> char 会自动忽略起始的空格/回车/tab,结尾如果有回车空格,不会丢弃。 ” aa” => “aa”
scanf(“%s”, char) 同上
cin >> string 同上

类型转换

  • int转string
// to_string()
#include <iostream>
#include <string>

using namespace std;

int main() {
    int num = 123;
    
    std::string str = to_string(num);

    std::cout << str;

    return 0;
}
  • string转int
// stoi()
#include <iostream>
#include <string>

int main() {

    std::string str = "123";
    int num;

    // 使用stoi()将str1的值存储到x
    num = std::stoi(str);

    std::cout << num;

    return 0;
}
  • char转int

使用std :: atoi()函数将char数组转换为int。 atoi()函数在cstdlib头文件中定义。

#include <iostream>

// atoi()需要 cstdlib
#include <cstdlib>

using namespace std;

int main() {

    // 声明和初始化字符数组
    char str[] = "456";
    int num = std::atoi(str);

   std::cout << "num = " << num;
    
    return 0;
}

标签:string,cin,char,str,字符串,相关,cout
From: https://www.cnblogs.com/hnu-hua/p/18179472

相关文章

  • 字符串总结
    哈希用于比较两个字符串是否相等;本质就是把一个字符串看成一个base进制的数(base自定),每一位是这一位的字符对应的$ASCII$值,在比较时只需判断这两个数(即哈希值)是否相等即可;一般的,base会选一个质数(200+即可),很容易发现,一个字符串的哈希值是很大的,所以要进行取模;Hash冲突当Has......
  • 021Dockerfile相关
    一、dockerhistory镜像层文件确认方法#(1)问:如何查询dockerfile里的ADDfile:a0a9df396dd400a83cc437cba4830851b18457de79db5955704378c6d206b9a1in/usr/local/java/实际文件file后的id?ADDfile:a0a9df396dd400a83cc437cba4830851b18457de79db5955704378c6d206b9a1i......
  • Keil编译后的Code,RO,RW,ZI等相关
    在使用keil开发STM32应用程序时,点击Build后在BuildOutput窗口中经常会有如下信息:以前一直好奇这几个参数和实际使用的STM32芯片中Flash和SRAM的对应关系,于是上网搜了一圈,做如下总结:这些参数的单位是Byte图中几个参数分别代表 Code:代码的大小RO:常量所占空间(加了const修饰......
  • 格式化字符串
       //{N,M:A}N是索引M是宽度A是预定义类型N和M逗号分隔,M和A用冒号分隔inta=900;intb=1055;Console.WriteLine("{0,4:C2}\n+{1,4:C2}\n------------\n{2,4:C2}",a,b,a+b);       decimalc=0.22m;Console.WriteLin......
  • buuctf-pwn-[第五空间2019 决赛]PWN5-格式化字符串漏洞
    题目地址:https://buuoj.cn/challenges#[第五空间2019决赛]PWN5先检查一下保护情况再拖进ida里分析找到一个格式化字符串漏洞,那么我们可以利用这个漏洞去获取或者改写dword_804C044的值从而进入if语句中,拿到shell什么是格式化字符串漏洞所谓格式化字符串漏洞,就是我们能控......
  • MMU相关介绍
    什么是MMUMMU即内存管理单元(MemoryManageUnit),是一个与软件密切相关的硬件部件,也是理解linux等操作系统内核机制的最困难的知识点之一。1)概述研究MMU无法绕过的一个东西就是分页内存管理机制,也就是研究——页表。页表内存放的就是虚拟地址到物理地址的转换关系,也就是虚拟地址......
  • php-strpos 判断一个字符串是否存在于另一个字符串中
    在PHP中,你可以使用strpos()函数来判断一个字符串(例如"play")是否存在于另一个字符串中。strpos()函数会返回子字符串在原始字符串中首次出现的位置(索引从0开始),如果子字符串不存在,则返回false。以下是一个简单的示例:$string="Iliketoplaybasketball";$substring......
  • 2024ICPC武汉邀请赛-G.Pack-数论分块、整除运算相关的不等式
    link:https://codeforces.com/gym/105143Groupcontests:https://codeforces.com/group/DWEH34LQgT/contest/521901题意:有\(n\)件\(A\)物品,\(m\)件\(B\)物品,两种物品价值分别是\(a,b\),若干件\(A\)和若干件\(B\)可以打包成一个商品,打包尽可能多的商品的情况下让剩余的......
  • Linux系统内核与内存相关知识
    目录目录文件系统NTFS文件系统的概述可靠性添加了功能POSIX支持删除限制NTFS的优点NTFS的缺点NTFS命名约定FAT概述FAT命名约定FAT的优点FAT的缺点NTFS文件系统和FAT32系统的区别区别Linux内核的作用一、前言二、Linux内核的作用三、驱动开发为什么要学习内核四、需要学习......
  • Session相关知识
    什么是Session当用户请求来自应用程序的Web页时,服务器会给每一个用户(浏览器)创建一个Session对象;用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去,默认情况下,只要浏览器没有关闭,这个Session就一直存在。Session的常用......