C++ C+中的字符串和字符数组问题+;

C++ C+中的字符串和字符数组问题+;,c++,arrays,C++,Arrays,我正在编写一个注册表生成器,作为更大程序的一部分。我在C++中很新,但是擅长其他编程语言,如PHP.< 我将首先提供有问题函数的代码: void generacionAleatoria() { string r_marca, r_nom, r_apellido; char r_patente[6]; int num_rand; registroAuto r_auto; string nombres[8] = { "Juan", "

我正在编写一个注册表生成器,作为更大程序的一部分。我在C++中很新,但是擅长其他编程语言,如PHP.< 我将首先提供有问题函数的代码:

void generacionAleatoria() {
    string r_marca, r_nom, r_apellido; 
    char r_patente[6];

    int num_rand; 
    registroAuto r_auto;


    string nombres[8] = {
        "Juan", "Pedro", "Roberto", "Miguel", "Guillermo", "Emilio", "Roque", "Gustavo"
    } ; 
    string apellidos[8] = {
        "Messi", "Maradona", "Gardel", "Heredia", "Pimpinela", "Nadal", "Mascherano", "Troilo"
    };
    string marcas[12] = {
        "Volvo", "Renault", "Audi", "Ford", "Fiat", "Chevrolet", "Nissan", "Volkswagen", "Mercedes Benz", "Rolls Royce", "Delorean", "Aston Martin"
    };

    char letras_patentes[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    char numeros_patentes[] = "0123456789"; 

    for (int i = 0; i < cantidad_autos; i++) {
        r_marca = marcas[rand() % (sizeof(marcas)/sizeof(marcas[0]) - 1)];
        r_nom = nombres[rand() % (sizeof(nombres)/sizeof(nombres[0]) - 1)];
        r_apellido = apellidos[rand() % (sizeof(apellidos)/sizeof(apellidos[0]) - 1)];

        for(int m = 0; m < 3; ++m) {
            r_patente[m] = letras_patentes[rand() % (sizeof(letras_patentes) - 1)];
        }   
        for(int n = 3; n < 6; n++) {
            r_patente[n] = numeros_patentes[rand() % (sizeof(numeros_patentes) - 1)];
        }

        strcpy(r_auto.patente,r_patente);
        strcpy(r_auto.marca,r_marca.c_str());   
        strcpy(r_auto.apellido,r_apellido.c_str());
        strcpy(r_auto.nom,r_nom.c_str());

        fwrite(&r_auto,sizeof(registroAuto),1,archivo);

        if (ver_variables_testeo) { 
            //cout << (i+1) << ") " << r_auto.patente<<endl;
            cout << (i+1) << ") " << r_auto.marca << " - " << r_auto.patente << " - " << r_auto.nom << " " << r_auto.apellido << endl; //Para testear
        }

    }
}
如果你想知道的话,这里是优步司机及其汽车的登记处:品牌、车牌、姓名和姓氏。嗯,这不是真正的注册,这是大学作业

问题是,当我打印出新结构的内容时,车牌和名称将在一起,如下所示:

100)菲亚特-KWQ293Maria-Maria Gardel

您可以通过连字符的位置看到,车牌现在是“KWQ293Maria”,即使它是一个6字符的数组

cout
命令的提醒:

cout << (i+1) << ") " << r_auto.marca << " - " << r_auto.patente << " - " << r_auto.nom << " " << r_auto.apellido << endl;
如您所见,这是我原始代码中4条语句中的最后一条,因此我不知道它为什么会影响r_auto.patente


你能帮帮我吗?我猜我在课堂上错过了一个字符数组处理的关键概念:-(

当将字符数组用作字符串时,它们需要以空字符
'\0'
结尾。因此,当你构建车牌时,你需要使数组
长7个
字符

struct registroAuto {
    char marca[15];
    char patente[7]; // 6 for numbers, 1 for terminator '\0'
    char nom[25];
    char apellido[25];
};
与工作变量相同:

char r_patente[7];
创建数字时,需要手动添加空终止符:

    for(int m = 0; m < 3; ++m) {
        r_patente[m] = letras_patentes[rand() % (sizeof(letras_patentes) - 1)];
    }
    for(int n = 3; n < 6; n++) {
        r_patente[n] = numeros_patentes[rand() % (sizeof(numeros_patentes) - 1)];
    }

    r_patente[6] = '\0'; // add the null terminator
for(int m=0;m<3;++m){
r_专利权人[m]=letras_专利权人[rand()%(sizeof(letras_专利权人)-1)];
}
对于(int n=3;n<6;n++){
r_专利权人[n]=numeros_专利权人[rand()%(sizeof(numeros_专利权人)-1)];
}
r_patente[6]='\0';//添加空终止符

如果不深入查看您的代码,我可以说文字字符串需要更多的空间。必须保留字符串的结尾(
'\0'
)。在您的情况下,
nom
的大小必须为7才能保存6个可见字符(至少)Cuar数组处理的关键概念是,你不应该使用char数组。C++有<代码> STD::String 。使用缓冲区溢出。避免痛苦计数和缓冲区大小的计算。只使用<代码> STD::String < /Calp>。检查
marcas
nombres
appelidos
数组中的最后一个值。您是否尝试通过调试器观察这些字符数组的内存内容?感谢您的输入!@Amadeus,您的解释帮助很大,并修复了我的随机生成器。不过,我还有第二个版本,用户可以n手动输入信息,他们可能会添加超过需要的字符。解决方案是否只需输入字符数组[100]如果使用7个字符数组,如果使用第七个字符,我就回到原来的问题了。@ VIC3685代码“StrcPy < /C++ >不好,用C++代替代码> StrncPy < /Cord>,它允许你指定要复制多少字符。正是为了最小化这种问题。
char r_patente[7];
    for(int m = 0; m < 3; ++m) {
        r_patente[m] = letras_patentes[rand() % (sizeof(letras_patentes) - 1)];
    }
    for(int n = 3; n < 6; n++) {
        r_patente[n] = numeros_patentes[rand() % (sizeof(numeros_patentes) - 1)];
    }

    r_patente[6] = '\0'; // add the null terminator