字符串知识

字符串相关的知识和操作:

• 字符串字面量:在 C++中,字符串字面量是用双引号括起来的字符序列,如"Hello, World!"。

• 字符串连接:可以使用+运算符或std::string::append方法来连接两个字符串。

• 字符串长度:std::string::length方法或size()方法可以返回字符串的长度。

• 字符串比较:可以使用==和!=运算符来比较两个字符串是否相等或不相等。<,>,<=,>=运算符可以用于比较字符串的字典顺序。

• 字符串查找:std::string::find方法用于查找子字符串在字符串中的位置。

• 字符串替换:std::string::replace方法可以替换字符串中的某些字符或子字符串。

• 字符串分割:可以使用std::istringstream或正则表达式来分割字符串。

• 字符串转换:除了to_string,还可以使用std::stoi,std::stol,std::stof,std::stod等函数将字符串转换为整数或浮点数。

• 字符串大小写转换:std::transform函数结合tolower或toupper函数可以用于转换字符串中字母的大小写。

• 字符串修剪:std::string::erase和std::string::find_first_not_of等方法可以用来去除字符串两端的空白字符。

• 字符串插入和删除:std::string::insert方法用于在字符串的指定位置插入字符或子字符串,std::string::erase方法用于删除指定位置的字符或子字符串。

• 字符串迭代器:可以使用迭代器遍历字符串中的每个字符,如`for (char c : str)。

• 字符串流:std::stringstream可以用来从字符串读取数据或将数据写入字符串。

to_string详解

to_string函数是 C++11 引入的一个非常实用的函数,它用于将各种数值类型转换为std::string类型。这个函数定义在<string>头文件中,因此在使用之前需要包含这个头文件。

函数原型

template <class T>
std::string to_string(T value);

这里的T可以是多种数值类型,包括但不限于:

• 整型:int,long,long long,unsigned int,unsigned long,unsigned long long等。

• 浮点型:float,double,long double。

• 枚举类型(enum)。

• 字符类型:char,wchar_t,char16_t,char32_t。

用法示例

• 转换整数为字符串:

int num = 123;
std::string str = std::to_string(num); // str == "123"

• 转换浮点数为字符串:

double pi = 3.14159;
std::string str = std::to_string(pi); // str 将包含 pi 的字符串表示,可能包含小数点后几位

• 转换枚举类型为字符串:

enum class Color { Red, Green, Blue };
Color c = Color::Green;
std::string str = std::to_string(static_cast<int>(c)); // 需要显式转换为整数类型

• 转换字符为字符串:

char ch = 'A';
std::string str = std::to_string(ch); // str == "65",字符 'A' 的 ASCII 值

• 转换布尔值为字符串:

bool flag = true;
std::string str = std::to_string(flag); // str == "1"

注意事项

• to_string函数不会保留数值的小数部分,如果需要保留小数,可以使用std::ostringstream或格式化库(如 C++20 的std::format)。

• 对于枚举类型,to_string默认不会转换为枚举的名称,而是转换为整数值。如果需要转换为枚举的名称,需要自定义转换逻辑。

• 对于布尔值,to_string会将其转换为"0"或"1",而不是"true"或"false"。如果需要转换为"true"或"false",同样需要自定义转换逻辑。

自定义转换

如果to_string不满足需求,可以自定义转换函数,例如:

或者使用std::ostringstream:

std::string floatToString(double value, int precision) {
    std::ostringstream os;
    os << std::fixed << std::setprecision(precision) << value;
    return os.str();
}

字符串处理

std::string类提供了丰富的方法来支持各种字符串操作。
• std::string::rfind:
与find相对应,rfind从字符串的末尾开始向前搜索子字符串。

std::string str = "example";
size_t pos = str.rfind("ex"); // 返回 4,因为 "ex" 从索引 4 开始的最后一次出现

• std::string::find_first_of`和`std::string::find_first_not_of:
这两个函数分别用于查找第一个出现的任意字符(在给定的字符集合中)和第一个不出现的字符(不在给定的字符集合中)。

size_t pos = str.find_first_of("aeiou"); // 返回 1,找到第一个元音 'a'
size_t pos = str.find_first_not_of("aeiou"); // 返回 0,找到第一个非元音 'e'

• std::string::find_last_of和std::string::find_last_not_of:
这两个函数与`find_first_of和`find_first_not_of`类似,但是它们从字符串的末尾开始搜索。
• std::string::substr:用于从字符串中提取子字符串。

std::string sub = str.substr(0, 3); // 提取从索引 0 开始的 3 个字符,结果是 "exa"

• std::string::compare:用于比较两个字符串。

int result = str.compare("examp"); // 返回 0,因为 "example" 等于 "examp"

• std::string::copy:用于将字符串复制到字符数组中。

char buffer[10];
str.copy(buffer, 6); // 将 "examp" 复制到 buffer 中

• std::string::erase:用于删除字符串中的字符。

str.erase(2, 3); // 删除从索引 2 开始的 3 个字符,结果是 "exle"

• std::string::insert:
用于在字符串的指定位置插入字符或子字符串。

str.insert(2, "a"); // 在索引 2 位置插入 'a',结果是 "exaple"

• std::string::replace:
用于替换字符串中的字符或子字符串。

str.replace(2, 3, "ple"); // 替换从索引 2 开始的 3 个字符为 "ple",结果是 "eple"

• std::string::swap:
用于交换两个字符串的内容。

std::string str1 = "hello";
std::string str2 = "world";
str1.swap(str2); // 交换 str1 和 str2 的内容

• std::string::clear:
用于清空字符串。

str.clear(); // 清空 str 的内容

• std::string::resize:
用于改变字符串的长度。

str.resize(5); // 将 str 的长度改变为 5,如果原长度大于 5,则截断;否则用空字符填充

• std::string::empty:
用于检查字符串是否为空。

if (str.empty()) {
    // 字符串为空
}

• std::string::push_back`和`std::string::pop_back:
用于向字符串末尾添加或移除字符。

str.push_back('!'); // 在末尾添加 '!'
str.pop_back(); // 移除末尾的字符

• std::getline:
用于从输入流中读取一行文本到字符串。

std::getline(std::cin, str); // 从标准输入读取一行到 str

• std::string::front   和   std::string::back  :
 分别用于访问字符串的第一个和最后一个字符。

char first = str.front(); // 获取第一个字符
char last = str.back();   // 获取最后一个字符

蓝桥杯真题:顺子日期

#include <bits/stdc++.h>
using namespace std;
int main()
{
  string s;
  string t1="012",t2="123";
  int ans=0;
  for(int i=1;i<=12;i++){
    for(int j=1;j<=31;j++){
      s="2022";
      if(i<10)s+='0'+to_string(i);
      else s+=to_string(i);
      if(j<10)s+='0'+to_string(j);
      else s+=to_string(j);
      if(s.find(t1)!=-1||s.find(t2)!=-1) ans++;
    }
  }
  cout<<ans;
  return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值