蓝桥杯备赛------chapter 2 C++代码格式与语法基础、基本输入输出、string
1.const表示常量
代码定义了一个全局常量N,值为100009,用于指定全局数组a的大小。数组a被自动初始化为0。
若不将数组声明为全局变量,则必须手动初始化,系统不会自动将其初始化为0。

2.在这里可以使用typedef 将long long类型定义为ll

3.scanf和printf
scanf用于读取用户输入的两个浮点数,分别存储在变量a和b中。printf则用于格式化输出这两个浮点数,其中%.2lf表示保留两位小数输出,%.3lf表示保留三位小数输出。

4. 字符串的输出
字符串的输出有个很有意思的地方,就是s前面没有"&"符号,这是因为s本身就是一个地址,表示s这个数组的首地址

采用图中所示方法无法读取空格或回车符后面的字符串内容。但是如果采用下面这种就可以。在这里面"^"表示正则表达式中的排除。

此外,还有一个点要注意,就是scanf和printf的效率高。
5.cin和cout
在C++中,通过cin和cout实现浮点数的输入输出时,使用fixed和setprecision(3)可以控制输出格式为固定小数点显示,并保留三位小数。该实现虽然逻辑清晰,但存在两个注意事项:一是缺少输入有效性检查,可能导致非数字输入时程序异常;二是setprecision(3)的设置会影响后续所有cout输出,需要重新设置才能恢复默认格式。

cin 是 C++ 中的标准输入流对象,用于从标准输入(通常是键盘)读取数据。在使用 cin 输入字符串时,遇到空格、制表符或换行符会停止读取。因此,如果输入的是 lan qiao,cin 只会读取第一个单词 lan,而不会继续读取后面的 qiao。如果要读取整行输入(包含空格),可以使用 getline 函数。


6.string(注意在string里面是没有"\0"的这个和char不一样)
6.1string 的声明
std::string str1;
std::string 是 C++ 标准库中用于处理字符串的类。如果在开头使用了using namespace std; 就不需要加上std。
6.2使用子字符串初始化
std::string str2 = "Hello, World!";
std::string str4 = str2.substr(0, 5);
-
substr是std::string提供的一个成员函数,用于提取子字符串。substr(start_pos, length)的含义是从字符串的start_pos位置开始,提取长度为length的子字符串。例如,str2.substr(0, 5)会提取"Hello"。
6.3使用重复字符初始化
std::string str6(5, 'A');
-
std::string提供了一个构造函数,可以用来创建一个指定长度的字符串,其中每个字符都是指定的字符。 -
例如,
std::string(5, 'A')会创建"AAAAA"。
6.4 将 `std::string` 转换为 C 风格字符串。

1. C 风格字符串与 `std::string` 的区别
C 风格字符串:是一个以 `\0`(空字符)结尾的字符数组。操作低效且不安全,容易出现越界访问等问题。例如:`char buf[100];` 是一个固定大小的字符数组。
- `std::string`:
- 是 C++ 标准库中的字符串类,提供了更高的安全性、灵活性和功能。
- 在内存管理上,`std::string` 会自动处理字符串的存储和扩展。
- 例如:`std::string str;` 是一个动态大小的字符串对象。
2. `std::string::c_str()` 的作用
- `std::string::c_str()` 是 `std::string` 类的一个成员函数,用于将 `std::string` 转换为 C 风格字符串。
- 它返回一个指向内部字符数组的指针,该指针指向的字符串以 `\0` 结尾。
- 返回值的类型是 `const char*`,表示一个不可修改的 C 风格字符串。
std::string str = "Hello";
const char* c_str = str.c_str(); // c_str 的值为 "Hello\0"
3. 为什么要使用 `c_str()`?
在 C++ 中,某些函数(如 `printf`)只能接受 C 风格字符串作为参数,而不是 `std::string` 对象。例如:
printf("str = %s\n", str.c_str());
- `printf` 需要一个 `const char*` 类型的参数,因此必须通过 `c_str()` 将 `std::string` 转换为 C 风格字符串。
4. 代码分析
#include <bits/stdc++.h>
using namespace std;
int main() {
char buf[100]; // 用于存储输入的 C 风格字符串
scanf("%s", buf); // 从标准输入读取字符串到 buf
string str(buf); // 使用 buf 初始化 std::string 对象 str
printf("str = %s\n", str.c_str()); // 使用 c_str() 将 str 转换为 C 风格字符串,然后输出
return 0;
}
5. 注意事项
- `c_str()` 返回的指针是只读的:
- `c_str()` 返回的 `const char*` 指针指向的内容不能被修改,否则会导致未定义行为。
- 如果需要修改字符串内容,请使用 `std::string` 的成员函数(如 `assign` 或 `replace`)。
- 性能问题:
- `c_str()` 并不会创建一个新的字符数组,而是直接返回 `std::string` 内部存储的字符数组。
- 如果 `std::string` 对象被销毁或修改,`c_str()` 返回的指针可能会失效。
6. 总结
`std::string::c_str()` 是一个非常实用的工具,但需要注意它返回的指针是只读的,并且不能超出 `std::string` 的生命周期。
7 string的各种操作
7.1 获取字符串的长度


使用s.length()的时候最好用一下强制类型转换,因为这个值的类型为unsign,不强制转换的话可能会出错。
7.2 拼接字符串
-
+运算符:适合简单拼接场景,但多次拼接时效率较低。 -
append()方法:适合频繁拼接的场景,性能更高。

7.3 字符串查找
-
查找子字符串:
-
使用
str.find("World")方法在字符串中查找子字符串"World"的位置。 -
如果找到子字符串,
find方法会返回子字符串在字符串中的起始索引(从 0 开始计数)。 -
如果未找到子字符串,
find方法会返回一个特殊的值std::string::npos。
-
-
判断是否找到:
-
使用
if (pos != std::string::npos)判断子字符串是否找到。 -
如果找到,输出子字符串的位置。
-
如果未找到,输出提示信息。
-
输出结果
假设字符串是 "Hello, World!",程序运行后会输出:
Substring found at position: 7
因为 "World" 从索引 7 开始(逗号和空格占了前 6 个字符)。





更多推荐



所有评论(0)