【发布时间】:2016-11-16 00:13:03
【问题描述】:
我正在尝试创建一个数组,并且数组中的每个对象都应该具有名称 Model(i),其中是索引,我这样做是为了让它们的名称按 Model5、Model4 的降序索引...我正在尝试使用 char[] 执行此操作,但由于某种原因,在我的代码中,在 for 循环中使用 strcat 使我陷入无限循环,如果有人可以提供帮助,第二点是以我可以连接的方式转换索引命名并给构造函数。
#include <iostream>
#include <stdio.h>
#include <string>
using namespace std;
class CARRO {
public:
CARRO() {};
CARRO(char *modelo, unsigned ano);
char* getModelo();
unsigned getAno();
private:
char modelo[100];
unsigned ano;
};
void swap(int *p, int *q);
int partition(int *v, int start, int end);
int randomizedPartition(int *v, int start, int end);
void qsHelper(int *v, int start, int end);
void quickSort(int *v, int len);
void printList(CARRO *carros, unsigned len);
int main(int argc, char const *argv[]) {
CARRO carros[5];
unsigned len = sizeof(carros)/sizeof(CARRO);
for (int i = 0; i < len; ++i) {
char modelo[] = "Modelo";
char id[] = "I";
strcat(modelo, id);
unsigned ano = 1000 * (i+1);
carros[i] = CARRO(modelo, ano);
cout << carros[i].getModelo() << endl;
}
//printList(carros, len);
return 0;
}
CARRO::CARRO(char *modelo, unsigned ano) {
strcpy(this->modelo, modelo);
this->ano = ano;
}
如果我删除该行:
strcat(modelo, id);
循环工作正常。我只是不明白为什么 strcat 会以某种方式生成无限循环。输出是这样的:(使用 strcat 行)
ModeloI
ModeloI
ModeloI
ModeloI
ModeloI
ModeloI
ModeloI
ModeloI
ModeloI
ModeloI
^CModeloI
【问题讨论】:
-
如果你使用 C++,你应该使用
std::string和相关的方法而不是 C 的strcat和字符数组 -
modelo仅创建大到足以容纳您初始化它的单词。如果您使用std::strcat使其内容更长,则您在数组边界之外写入会导致未定义的行为。 -
您在
char modelo[] = "literal"上没有收到警告吗?我认为您使用代码输入了任何可能发生的区域。检查这个:stackoverflow.com/questions/8356223/… -
@GovindParmar 我想我会结束这样做,但是有什么可以解决这个错误的吗?或者解释一下为什么 strcat 会导致这种情况?就像循环哨兵定义明确并且没有改变循环内 i 的值。我知道为什么会这样:(