小丫小屁孩 2019-09-24 11:22 采纳率: 75%
浏览 388
已采纳

c++string和char[],我有一段代码,和测试数据,但是我发现使用string时这段代码出错了,我把string换成对应的char []后代码正常运行

题目描述:
职工有职工号,姓名,年龄.输入n个职工的信息,找出3个年龄最小的职工打印出来。输入第一行包括1个整数N,1<=N<=30,代表输入数据的个数。
接下来的N行有N个职工的信息:
包括职工号(整数), 姓名(字符串,长度不超过10), 年龄(1<=age<=100)。
输出描述:
可能有多组测试数据,对于每组数据,
输出结果行数为N和3的较小值,分别为年龄最小的职工的信息。
关键字顺序:年龄>工号>姓名,从小到大。

代码思路很简单,维持一个长度为4的数组(有序),每输入一个数据就插入排序(0->n是从小到大,),最终输出前三,但是我这代码通过了90%测试,最后停在一个测试数据上,我debug后发现,问题出现在90 30 61这一行的输入上。他错误地认为61小于18,然后把63插入到数组中(debug的时候想输出一下string name的值然后程序就卡死了)。之后我用char name[10]代替了结构体中的string name,问题就解决了。想问以下为什么。

#include<iostream>
#include<string.h>
using namespace std;
struct stuff{
    string name;
    int age;
    int id;
    stuff(string n,int i,int a){
        name=n;
        id=i;
        age=a;
    }
};

void insertsort(stuff* stuffs[],stuff* s){
    int i,j;
    for(i=0;i<3;i++){
        if( (s->age<stuffs[i]->age) || (s->age==stuffs[i]->age)&&(s->id<stuffs[i]->id) || (s->id==stuffs[i]->id)&&(s->name<stuffs[i]->name)){
            for(j=3;j>i;j--){
                stuffs[j]=stuffs[j-1];
            }
            stuffs[i]=s;
            break;
        }
    }

}

int main(){

    int n,i,j;
    while(cin>>n){
        stuff* stuffs[4];

        for(i=0;i<4;i++){
            stuffs[i]=new stuff("nn",-10,10000);
        }
        string name;
        int id;
        int age;
        for(i=0;i<n;i++){
            cin>>id>>name>>age;
            stuff* s = new stuff(name,id,age);
            insertsort(stuffs,s);
        }
        for(i=0;i<3;i++){
            cout<<stuffs[i]->id<<" "<<stuffs[i]->name<<" "<<stuffs[i]->age<<"\n";
        }
    }

    return 0;
}

出现问题的数据:
19
80 53 96
7 51 78
55 14 51
58 40 44
78 74 27
50 75 53
95 41 43
90 99 18
8 67 69
60 67 94
12 64 85
90 30 61
29 7 39
45 20 79
45 95 16
79 61 70
32 69 80
97 55 24
68 67 17

应该输出的结果:
45 95 16
68 67 17
90 99 18
实际输出的结果:
45 95 16
68 67 17
97 55 24

当我把结构体中string name用char name[10]代替后发现正常输出了。

说的不清楚,用char name[]替换string name并不是仅仅替换名字,以下是替换后的代码

#include<iostream>
#include<string.h>
using namespace std;
struct stuff{
    char name[10];
    int age;
    int id;
    stuff(char n[10],int i,int a){
        int k=0;
        while(n[k]!='\0'){
            name[k]=n[k];
            k++;
        }
        name[k]='\0'; 
        id=i;
        age=a;
    }
    stuff(){

    }
};

void insertsort(stuff* stuffs[],stuff* s){
    int i,j;
    for(i=0;i<3;i++){
        if( (s->age<stuffs[i]->age) || (s->age==stuffs[i]->age)&&(s->id<stuffs[i]->id) || (s->id==stuffs[i]->id)&&(strcmp(stuffs[i]->name,s->name)==0)){
            for(j=3;j>i;j--){
                stuffs[j]=stuffs[j-1];
            }
            stuffs[i]=s;
            break;
        }
    }

}

int main(){

    int n,i,j;
    char tmpname[]="jahah";
    while(cin>>n){
        stuff* stuffs[4];
        for(i=0;i<4;i++){
            stuffs[i]=new stuff(tmpname,-10,10000);
        }

        char name[10];
        int id;
        int age;

        for(i=0;i<n;i++){
            cin>>id>>name>>age;
            stuff* s = new stuff(name,id,age);
            insertsort(stuffs,s);
        }
        for(i=0;i<3;i++){
            cout<<stuffs[i]->id<<" "<<stuffs[i]->name<<" "<<stuffs[i]->age<<"\n";
        }
    }   




}
  • 写回答

4条回答 默认 最新

  • qtchen_1988 2019-09-24 11:40
    关注

    你的问题太笼统了,能举个例子不?这个问题要看你自己比较熟悉哪个,如果比较喜欢c++,又使用比较熟悉,就用string,如果你比较熟悉c数组,那就用char [];
    个人觉得并没有谁比谁更稳定,只是使用的人熟悉程度罢了。

    新更新:

    s->name<stuffs[i]->name 这个是字符串,不能这么比较;
    

    下图就说明问题了:
    图片说明

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥30 STM32 INMP441无法读取数据
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境