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

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 这个是字符串,不能这么比较;
    

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

    点赞 打赏 评论
  • infoworld 2019-09-24 11:29
    1. 你说反了, std::stringchar[] 稳定, 比如存储字符串会自动扩展和添加结束符号,不用担心越界问题.
    2. 输出也不是问题string.c_str()
    3. 字符串拼接直接用+号, 比数组方便多.
    点赞 打赏 评论
  • dabocaiqq 2019-09-24 12:00

    没有这样的说法,string内部也是基于char[]的。但是要注意,string不是线程安全的,多线程需要同步,而char存在越界的问题,所以关键看你怎么用。

    点赞 打赏 评论
  • 白色一大坨 2019-09-24 17:39

    你代码全不全,就这些了吗,好像不能复现故障

    点赞 打赏 评论

相关推荐 更多相似问题