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

时间:2016-07-29 01:20:51

标签: 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", "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个以下类型的结构:

struct registroAuto {
    char marca[15];
    char patente[6];
    char nom[25];
    char apellido[25];
}; 

如果您想知道,这是Uber司机及其汽车的注册表:品牌,车牌,姓名和姓氏。嗯,它不是真正的注册表,它是大学的家庭作业。

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

100)菲亚特 - KWQ293Maria - Maria Gardel

您可以通过连字符的位置看到,牌照现在是&#34; KWQ293Maria&#34;,即使它是一个包含6个字符的数组!

提醒cout命令:

cout << (i+1) << ") " << r_auto.marca << " - " << r_auto.patente << " - " << r_auto.nom << " " << r_auto.apellido << endl;

我做了一些测试,但我不知道如何处理结果。

1:注释掉名称的strcopy修复了问题

    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());

正如您所看到的,这是我原始代码中的4个语句中的最后一个,所以我不知道为什么它会影响r_auto.patente。

你能帮帮我吗?我猜测那里是我在课堂上错过的char数组处理的关键概念: - (

1 个答案:

答案 0 :(得分:1)

将字符数组用作字符串时,需要使用空字符'\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