字符串
1.strcpy,strcat不安全,不检查剩余空间,容易缓存溢出
2.scanf不安全,同样不检查剩余空间,且不能读取空格。
cpp
#include<iostream>
using namespace std;
int main()
{
char str[5];
scanf("%s",str);
//输入abc def res:abc\0
//输入abcdef 空间溢出
return 0;
}
fgets安全,剩余空间充足的情况下会吧'\n'一起读进去并补上'\0';
cpp
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
char buf[20];
cout << "请输入一行文字(可以带空格):" << endl;
// fgets(数组名, 最多读取字符数(有效字符-1,留一位放'\0'), 从哪里读:stdin键盘)
fgets(buf, sizeof(buf), stdin);
// 核心:把fgets读进来的换行符 \n 删掉
char* p = strchr(buf, '\n');
if(p)
{
*p = '\0';
}
cout << "处理后的字符串:" << buf << endl;
return 0;
}
递归
汉诺塔问题
cpp
#include<iostream>
using namespace std;
void hanoi(int n,char start,char around,char end)
{
if(n>1){
//将n-1个放在b
hanoi(n-1,start,end,around);
//将最后一个放在c
hanoi(1,start,around,end);
//将b上的n-1个放于c
hanoi(n-1,around,start,end);
}else if(n==1){
cout<<start<<"->"<<end<<endl;
}
}
int main()
{
hanoi(9,'a','b','c');
return 0;
}
归并排序
cpp
#include<iostream>
#include<vector>
#include<time.h>
using namespace std;
//归并排序:合并两个有序子数组
//arr:原数组,tmp:临时数组;[left,mid]左区间,[mid+1,right]右区间,两个区间各自有序
void merge(vector<int>&arr,vector<int>&tmp,int left,int right,int mid) {
//把当前待合并区间的元素全部复制到临时数组tmp,防止覆盖丢失数据
for(int i=left; i<=right; i++)
tmp[i]=arr[i];
int i,j,k;
//i:左区间起点;j:右区间起点;k:结果数组arr的写入位置
for(i = left,j = mid + 1,k = left ; i <= mid && j <= right ; k++) {
//比较tmp左右两部分,较小值放回原数组arr
if(tmp[i] < tmp[j])
arr[k] = tmp[i++];
else
arr[k] = tmp[j++];
}
//左区间还有剩余元素,直接复制到arr后面(剩余元素本身有序)
while(i <= mid) arr[k++] = tmp[i++];
//右区间还有剩余元素,直接复制到arr后面(剩余元素本身有序)
while(j <= right) arr[k++] = tmp[j++];
}
//归并排序递归函数:对arr[left...right]区间排序
void mergeSort(vector<int>&arr,vector<int>&tmp,int left,int right) {
//递归终止条件:left >= right,区间只有一个元素或者空,不用排序
if(left<right) {
//计算中点,等价于 (left+right)/2,防止left+right溢出
int mid=left+(right-left)/2;
//递归排序左半部分 [left, mid]
mergeSort(arr,tmp,left,mid);
//递归排序右半部分 [mid+1, right]
mergeSort(arr,tmp,mid+1,right);
//合并左右两个已经排好序的子区间
merge(arr,tmp,left,right,mid);
}
}
int main() {
srand(time(0));//设置随机数种子,每次运行产生不同随机数组
vector<int>arr(100);//创建大小为100的数组
vector<int>tmp(100);//归并排序需要的临时辅助数组
for(int i=0; i<arr.size(); i++)
arr[i]=rand();//填充随机整数
mergeSort(arr,tmp,0,arr.size()-1);//调用归并排序,对整个数组排序
for(auto e:arr)cout<<e<<endl;//遍历输出排序后的数组
return 0;
}