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;
}
相关推荐
周杰偷奶茶1 小时前
【Java】运算符指南
java·开发语言
2601_966949651 小时前
量化回测中分钟数据应该如何保存?从文件到数据仓库的工程化设计
开发语言·python·pandas·量化交易·股票数据·quantdash
Zhou1411362 小时前
SpringMVC_02_注解开发实战
开发语言·windows·python
繁华的地方不一定留下你的脚印2 小时前
C++ 算法与 ranges:用 find_if、transform 写清数据处理意图
开发语言·c++·算法
霸道流氓气质2 小时前
Mermaid 图表完全指南:从文本语法到LangGraph4j工作流可视化实战
开发语言·python
泡海椒2 小时前
JQuick-Excel 项目定位与适用场景:声明式 Java Excel 的边界
java·开发语言·excel
slandarer3 小时前
MATLAB | R2026b 更新了哪些有趣的新东西
开发语言·数据库·matlab
工具派3 小时前
Word文档太大怎么拆分?段落结构与两种拆法的边界实测
开发语言·c#·word
wjcroom3 小时前
实现老型号HP打印机手机无线打印的一些步骤和方法
开发语言·智能手机·php