我正在编写一个注册表生成器作为更大程序的一部分。我是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数组处理的关键概念: - (答案 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