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

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




}

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

新更新:

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

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

  1. 你说反了, std::stringchar[] 稳定, 比如存储字符串会自动扩展和添加结束符号,不用担心越界问题.
  2. 输出也不是问题string.c_str()
  3. 字符串拼接直接用+号, 比数组方便多.

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

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