有谁知道这个程序的问题吗!
每次运行,相同的程序,不同的输出,报错内容还不一样
最关键的是我不同软件运行出来不同结果!
#include<bits/stdc++.h>
using namespace std;
struct student{
string name;
int Math_score;
int English_score;
};
bool cmp(student s1,student s2){
return s1.Math_score <= s2.Math_score;
}
int main(){
student s[50005];
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%s %d %d",&s[i].name,&s[i].Math_score,&s[i].English_score);
}
sort(s,s+n,cmp);
cout<<endl;
for(int i=0;i<n;i++){
cout<<s[i].name<<" "<<s[i].Math_score<<" "<<s[i].English_score<<endl;
}
}
各种奇葩代码结果:
有人解答一下吗??
在调用地方,结构成员name后面加个.c_str(),然后在定义student结构的地方给name成员申请一块空间应该就可以了。
测试代码如下:
参考链接:
#include<bits/stdc++.h>
using namespace std;
struct student{
string name;
// https://blog.csdn.net/weixin_42240667/article/details/103596532
student(){ // 给成员name申请一块空间
name.resize(10);
}
int Math_score;
int English_score;
};
bool cmp(student s1,student s2){
return s1.Math_score <= s2.Math_score;
}
int main(){
student s[50005];
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
// https://zhuanlan.zhihu.com/p/166169343
// cout<<"size="<<s[i].name.size()<<endl;
scanf("%s %d %d",s[i].name.c_str(),&s[i].Math_score,&s[i].English_score);
}
sort(s,s+n,cmp);
cout<<endl;
for(int i=0;i<n;i++){
// https://blog.csdn.net/blue_mxy/article/details/105530067
cout<<s[i].name.c_str()<<" "<<s[i].Math_score<<" "<<s[i].English_score<<endl;
}
}
string name;
->
char name[100];
同步是个过程,阻塞是线程的一种状态:当多个线程访问同一资源时,规定同一时间只有一个线程可以进行访问,所以后访问的线程将阻塞,等待前访问的线程访问完。
注意:线程同步不一定发生阻塞!线程同步的时候,需要协调推进速度,只有当访问同一资源出现互相等待和互相唤醒会发生阻塞。
问题1: 数组排序结果不稳定
问题2: 报错信息 "Segmentation fault (core dumped)"
问题3: 使用不同的编译软件得到的结果不一样
根据奇怪的代码结果中的第一个例子,可以看出问题可能出现在排序算法上。不同的排序算法在处理相同的输入时,可能会产生不同的输出。
解决这个问题的一种方法是使用稳定的排序算法,如归并排序或插入排序。
以下是使用插入排序对数组进行排序的示例代码:
#include <iostream>
void insertionSort(int arr[], int n) {
int i, key, j;
for (i = 1; i < n; i++) {
key = arr[i];
j = i - 1;
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j = j - 1;
}
arr[j + 1] = key;
}
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
int n = sizeof(arr) / sizeof(arr[0]);
insertionSort(arr, n);
for (int i = 0; i < n; i++) {
std::cout << arr[i] << " ";
}
return 0;
}
运行这段代码将输出正确排序的数组。
根据奇怪的代码结果中的第二个例子,问题可能是由于段错误引起的。段错误通常是在程序试图访问无效的内存地址时发生的。
解决这个问题的一种方法是仔细检查代码,确保没有访问未定义的内存地址。特别要注意以下几个方面:
在调试过程中,可以使用调试工具如GDB来定位段错误的具体位置。
根据奇怪的代码结果中的第三个例子,不同的编译软件可能会使用不同的优化选项或标准库版本,导致输出结果不一致。
为了确保输出结果的稳定性,建议在编译时指定特定的优化选项和标准库版本。另外,确保在不同的编译软件中使用相同的编译选项。
可以使用以下命令编译C++程序,并指定特定的标准库版本和优化选项:
g++ -std=c++11 -O2 main.cpp -o executable
这个命令将使用C++11标准并开启-O2优化级别来编译名为main.cpp的源代码,并输出可执行文件executable。
希望以上解决方案对你有帮助。如果你有任何疑问,请随时提问。