C++排序出大问题!

有谁知道这个程序的问题吗!
每次运行,相同的程序,不同的输出,报错内容还不一样
最关键的是我不同软件运行出来不同结果!

#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;
    }
}

各种奇葩代码结果:

img

img

img

有人解答一下吗??

在调用地方,结构成员name后面加个.c_str(),然后在定义student结构的地方给name成员申请一块空间应该就可以了。

测试代码如下:

参考链接:


string中c_str()的使用方法和特性 - 知乎 标准库的string类提供了3个成员函数来从一个string得到c类型的字符数组:c_str()、data()、copy(p,n)。 c_str()是Borland封装的String类中的一个函数,它返回当前字符串的首字符地址。换种说法,c_str()函数返回一… https://zhuanlan.zhihu.com/p/166169343

C++中string用scanf的输入和~scanf()_c++中字符串中用scanf输入_blue_mxy的博客-CSDN博客 1. cinstring s;while(cin >> s){}//可以一直执行2. scanf定义:string s;s.resize();//设置长度输入scanf("%s",&s[0]);输出printf("%s\n",s.c_str());//输出有效字符cout << s << endl;//剩余字符用空..._c++中字符串中用scanf输入 https://blog.csdn.net/blue_mxy/article/details/105530067


#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;
    }
}
 

img

string name;
->
char name[100];

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7571567
  • 这篇博客你也可以参考下:【c++】一个数组中只有两个数字是出现一次, 其他所有数字都出现了两次。 找出这两个只出现一次的数字,编程实现。
  • 除此之外, 这篇博客: C/C++后端开发面经(1)——计算机操作系统中的 1.3.3 线程同步与阻塞的关系?同步一定阻塞吗?阻塞一定同步吗? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    同步是个过程,阻塞是线程的一种状态:当多个线程访问同一资源时,规定同一时间只有一个线程可以进行访问,所以后访问的线程将阻塞,等待前访问的线程访问完。
    注意:线程同步不一定发生阻塞!线程同步的时候,需要协调推进速度,只有当访问同一资源出现互相等待和互相唤醒会发生阻塞。

  • 以下回答来自chatgpt:

    解决方案:

    问题1: 数组排序结果不稳定

    问题2: 报错信息 "Segmentation fault (core dumped)"

    问题3: 使用不同的编译软件得到的结果不一样

    问题1解决方案:

    根据奇怪的代码结果中的第一个例子,可以看出问题可能出现在排序算法上。不同的排序算法在处理相同的输入时,可能会产生不同的输出。

    解决这个问题的一种方法是使用稳定的排序算法,如归并排序或插入排序。

    以下是使用插入排序对数组进行排序的示例代码:

    #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;
    }
    

    运行这段代码将输出正确排序的数组。

    问题2解决方案:

    根据奇怪的代码结果中的第二个例子,问题可能是由于段错误引起的。段错误通常是在程序试图访问无效的内存地址时发生的。

    解决这个问题的一种方法是仔细检查代码,确保没有访问未定义的内存地址。特别要注意以下几个方面:

    • 数组越界访问,例如 arr[-1] 或 arr[length]。
    • 未初始化指针,例如使用未初始化的指针进行内存访问。
    • 释放了内存但仍然在使用。
    • 空指针访问,例如访问空指针的成员。

    在调试过程中,可以使用调试工具如GDB来定位段错误的具体位置。

    问题3解决方案:

    根据奇怪的代码结果中的第三个例子,不同的编译软件可能会使用不同的优化选项或标准库版本,导致输出结果不一致。

    为了确保输出结果的稳定性,建议在编译时指定特定的优化选项和标准库版本。另外,确保在不同的编译软件中使用相同的编译选项。

    可以使用以下命令编译C++程序,并指定特定的标准库版本和优化选项:

    g++ -std=c++11 -O2 main.cpp -o executable
    

    这个命令将使用C++11标准并开启-O2优化级别来编译名为main.cpp的源代码,并输出可执行文件executable。

    希望以上解决方案对你有帮助。如果你有任何疑问,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^