GAMIT与TBC高精度基线解算结果差异分析与统一策略
2026/10/10 3:42:04
1.strcpy,strcat不安全,不检查剩余空间,容易缓存溢出
2.scanf不安全,同样不检查剩余空间,且不能读取空格。
#include<iostream> using namespace std; int main() { char str[5]; scanf("%s",str); //输入abc def res:abc\0 //输入abcdef 空间溢出 return 0; }fgets安全,剩余空间充足的情况下会吧'\n'一起读进去并补上'\0';
#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; }汉诺塔问题
#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; }归并排序
#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; }