C语言-408

字符串

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;
}
相关推荐
FRing031 分钟前
vue2干货总结8(路由模块封装、router-link、声明式导航、路由重定向、编程式导航)
开发语言·前端·vue.js·vue2
旖旎夜光3 分钟前
【C++ 基础入门】C++ 多态(上):虚函数、重写、override/final 与抽象类
开发语言·c++·笔记·学习
starzy199024 分钟前
深入理解Scala嵌套函数:作用域封装之道
开发语言·scala
Sakura_j_h_33 分钟前
从零写一个 MCP stdio Server:用 Python 校验博客文章格式
开发语言·python·自动化·ai工具·mcp·json-rpc
白杨尚青2 小时前
C++进阶篇(五):红黑树——四条规则、三种插入情况与旋转变色
开发语言·数据结构·c++·stl·红黑树·平衡二叉树
.道阻且长.2 小时前
Linux基本开发工具:gdb和cgdb的使用
linux·运维·服务器·开发语言
starzy19903 小时前
深入理解Scala匿名函数:函数式编程基石
开发语言·scala
apcipot_rain4 小时前
C++转Java日记(05)
java·开发语言·c++
apcipot_rain13 小时前
C++转Java日记(04)
java·开发语言·c++
wuyk55513 小时前
Keil工具链-第05讲-启动文件与__main到底做了什么
c语言·stm32·单片机·嵌入式硬件·物联网