C++语法基础二
1.数组初始化
全局数组:作用域覆盖整个程序,存放在静态存储区,内存是固定分配的,会默认自动初始化为 0。
局部数组:局部范围,存储在栈区,内存是动态分配的,没有默认初始化逻辑,元素值会是随机的脏数据。
// 全局数组:作用域全局,自动初始化为0
int global_arr[5];
void test() {// 局部数组:仅在test函数内有效,元素为随机值int local_arr[5];
}
2.函数
2.1函数基本结构:
返回值类型 函数名(参数列表) {
// 函数体
return 返回值; // 如果有返回值的话
}
2.2函数常见用法
-
无参数无返回值的函数
-
有参数有返回值的函数
-
多参数函数
-
函数的重载 ( 和 Java 中的重载类似,同一作用域内,函数名相同,参数列表不同”(参数类型、数量、顺序至少一项不同),与返回值类型无关 )
#include <iostream>
using namespace std;
int add(int a, int b) {return a + b;
}
double add(double a, double b) {return a + b;
}
int main() {cout << add(3, 4) << endl; // 输出7cout << add(3.5, 4.5) << endl; // 输出8.0return 0;
}
- 递归函数
3.string
3.1 string的声明与初始化
#include <iostream>
#include <string>
int main(){// 声明并初始化一个空字符串std::string str1;// 使用字符串变量初始化字符串std::string str2 = "Hello, World";// 使用另一个 std::string 对象来初始化字符串std::string str3 = str2;// 使用部分字符串初始化字符串,substr(起始位置,长度)std::string str4 = str2.substr(0, 5);// 使用字符数组初始化字符串const char *charArray = "Hello";std::string str5(charArray);// 使用重复的字符初始化字符串,string(个数,字符)std::string str6(5, 'A');// 输出字符串内容std::cout << "str1:" << str1 << std::endl;std::cout << "str2:" << str2 << std::endl;std::cout << "str3:" << str3 << std::endl;std::cout << "str4:" << str4 << std::endl;std::cout << "str5:" << str5 << std::endl;std::cout << "str6:" << str6 << std::endl;return 0;
}
注意:输入整行字符串(含空格)时,默认的 cin >> str 会在空格 / 换行处停止读取,若需读取包含空格
的整行字符串,需使用 getline(cin, str)。
3.2 string输出 (printf)
-
在 C++ 中,std::string 类提供了一个成员函数 c_str (),用于返回一个指向以空字符结尾的 C
风格字符串(即 const char*类型)。
-
在进行 printf 输出时,需要将 string 转换为 C 风格的字符串进行输出。
#include <bits/stdc++.h>
using namespace std;int main(){ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);char buf[100]; // 临时变量,用于输入scanf("%s", buf); // 输入bufstring str(buf); // 用buf来构造strprintf("str = %s\n", str.c_str()); // 输出strreturn 0;
}
// 输入:Hello
// 输出:str = Hello
3.3 string基本操作
- 获取字符串长度(length/size):
str.length()
#include <bits/stdc++.h>
using namespace std;int main(){std::string str = "Hello, World";int length = str.length(); // 或者 int length = str.size();std::cout << "length:" << length << std::endl;return 0;
}
// 输出:length:12
- 拼接字符串(+或者append)
str1.append(", ").append(str2)
#include <bits/stdc++.h>
using namespace std;int main(){std::string str1 = "Hello";std::string str2 = "World";std::string result1 = str1 + ", " + str2; // 使用 + 运算符std::string result2 = str1.append(", ").append(str2); // 使用append()函数std::cout << "Result1:" << result1 << std::endl;std::cout << "Result2:" << result2 << std::endl; return 0;
}
// 输出:Result1:Hello, World
// Result2:Hello, World
- 字符串查找(find)
str.find("World")查找子字符串的位置
#include <bits/stdc++.h>
using namespace std;int main(){std::string str = "Hello,World";size_t pos = str.find("World"); // 查找子字符串的位置if(pos != std::string::npos){std::cout << "Substring found at position:" << pos << std::endl;} else{std::cout << "Substring not found." << std::endl;}return 0;
}
// 输出:Substring found at position:7
- 字符串替换(replace)
str.replace(7, 5, "Universe")
#include <bits/stdc++.h>
using namespace std;int main(){std::string str = "Hello,World";str.replace(7, 5, "Universe"); // 替换子字符串,replace(起始位置,长度,替换字符)std::cout << "Result:" << str << std::endl; return 0;
}
// 输出:Result:Hello,Universe
- 提取子字符串(substr)
subStr = str.substr(7, 5)
using namespace std;int main(){std::string str = "Hello, World";std::string subStr = str.substr(7, 5); // 提取子字符串,substr(位置,长度),注意不要越界std::cout << "Substring:" << subStr << std::endl;return 0;
}
// 输出:Result:Substring:World
-
字符串比较(compare)
std::string 重载了 ==、<、> 等运算符,可直接按字典序比较,比 compare() 更简洁
str1.compare(str2)返回一个整数表示比较结果
#include <bits/stdc++.h>
using namespace std;int main(){std::string str1 = "Hello";std::string str2 = "World";int result = str1.compare(str2); // 比较字符串if(result == 0){std::cout << "String are equal." << std::endl;}else if(result < 0){std::cout << "String 1 is less than String 2." << std::endl; }else {std::cout << "String 1 is greater than String 2." << std::endl;} return 0;
}
// 输出:String 1 is less than String 2.
-
常用的遍历string的方法有两种:
循环枚举下标
auto枚举(其中&表示取引用类型,如果对i修改将会改变原来的值)
#include <bits/stdc++.h>
using namespace std;int main(){string s = "Hello";for (int i = 0;i < s.length(); ++i){cout << s[i];}cout << '\n';for(auto i : s){ //循环时,会把 s 里的每个字符(比如 s[0]、s[1])逐个复制到 i 里cout << i;i = 'a'; // 此处的修改无效,因为这个i是拷贝出来的,而不是引用s的 }cout << '\n';// 此时s = "Hello"for (auto i : s){cout << i;i = 'a'; // 此处修改会改变s的字符值 } cout << '\n';cout << s << '\n'; return 0;
}
// 输出:Hello
// Hello
// Hello
// Hello
3.3 字符串反转
reverse(s.begin(), s.end());(s为字符串)
reverse(s.begin(), s.end());是 C++ 标准库中的字符串 / 容器反转函数,核心作用是将字符串 s 的内容首尾颠倒。
#include <bits/stdc++.h>
using namespace std;
int main()
{string s;getline(cin, s);reverse(s.begin(), s.end());cout << s << '\n';return 0;
}
- 倒序输出(字符串本身未改变)
#include <bits/stdc++.h>
using namespace std;int main()
{string s;getline(cin, s);for(int i = (int)s.length() - 1;i >= 0; --i){cout << s[i];}return 0;
}
- 手动实现字符串反转的 “交换法”
#include <bits/stdc++.h>
using namespace std;int main()
{string s;getline(cin, s);for(int i = 0;i < s.length() / 2; ++i)swap(s[i], s[s.length() - i - 1]);cout << s << '\n';return 0;
}