作业描述
(之后补)
解题过程
因为这次只能用最基础的课上讲过的一些数据结构,比如数组、结构,string什么的都不能用,所以比较麻烦
首先是写了个处理输入的函数
Transaction* createTransArr(const char* input) {
Transaction trans[300];
int index = 1; //判断在一个transaction的什么位置
int i = 0, j = 0, k = 0; //k for transaction array
int has_begin = -1; //判断一个transaction的开始or结束
char tmp_arr[10] = { '\0' };
Transaction t;
while (i < MAX_LEN) {
char tmp = input[i];
if (tmp == '"' && has_begin == -1) {
has_begin = 1; //一个transaction开始
t = { 0 };
}
else if (tmp == '"' && has_begin == 1) {
//一个transaction的结束
has_begin = -1;
trans[k] = t;
k++;
index = 1;
}
else if (tmp != '[') {
if (tmp == ',') {
if (index % 5 == 1) {
//t一定要声明成指针,可以参考csdn
t.name = tmp_arr;
}
else if (index % 5 == 4) {
t.city = tmp_arr;
}
else {
int x = 1;
int res = tmp_arr[0] - '0';
while (tmp_arr[x] != '\0') {
res = res * 10 + (tmp_arr[x] - '0');
x++;
}
if (index % 5 == 2) {
t.time = res;
}
else if (index % 5 == 3) {
t.amount = res;
}
}
//clear
j = 0;
//注意char数组的清空
memset(tmp_arr, 0, sizeof(tmp_arr) / sizeof(char));
index++;
}
else if (tmp == ']') {
break;
}
else {
tmp_arr[j] = tmp;
j++;
}
}
i++;
}
return trans;
}
这段代码是有错误的,一步步调试才发现错误之处。我每次处理输入里的一个transaction的时候,是一个字符一个字符读,然后存到一个tmp_arr里,用index判断位置看是name还是city还是其它内容,struct中这两个都是char*类型的,确定是name或者city就把tmp_arr赋给它,然后清空tmp_arr
这样的问题在于,我struct中的name,city其实永远指向tmp_arr首地址,tmp_arr变成什么struct里面就是什么
(以及里面index部分还有一点错之后一起改了)
只好在每次给新的struct赋值的时候用strcpy()复制一份字符数组出来赋值
但其实本质上并没有解决问题。因为struct中的类型是char*不能直接copy,所以每次是再开了一个新数组copy之后赋给t的name或者city,但还是会遇到和上面一样的问题,所以最后还是采用了修改struct,把name和city都设成了char数组。
注意设成char数组之后是不能直接给t.name赋值的,会报“不可修改的左值”的错误,但是可以用strcpy赋值
修改之后的代码如下(里面的一些逻辑也有做调整,不具体解释了):
Transaction* createTransArr(const char* input) {
Transaction trans[MAX_TRANS_SIZE] = {0};
int index = 1; //判断在一个transaction的什么位置
int i = 0, j = 0, k = 0; //k for transaction array
int has_begin = -1; //判断一个transaction的开始or结束
char tmp_arr[10] = { '\0' };
Transaction t;
while (i < MAX_LEN) {
char tmp = input[i];
if (tmp == '"' && has_begin == -1) {
has_begin = 1; //一个transaction开始
t = { 0 };
}
else if (tmp != '[') {
if (tmp == '"' && has_begin == 1) {
//一个transaction的结束
has_begin = -1;
// trans[k] = t;
// k++;
index++;
}
else if (tmp == ']') {
strcpy_s(t.city, tmp_arr);
trans[k] = t;
break;
}
else if (tmp == ',') {
if (index % 5 == 1) {
//t一定要声明成指针,可以参考csdn
strcpy_s(t.name, tmp_arr);
}
/* else if (index % 5 == 4) {
strcpy_s(t.city, tmp_arr);
}*/
else if (index % 5 == 0) {
strcpy_s(t.city, tmp_arr);
trans[k] = t;
k++;
index = 0;
}
else {
int x = 1;
int res = tmp_arr[0] - '0';
while (tmp_arr[x] != '\0') {
res = res * 10 + (tmp_arr[x] - '0');
x++;
}
if (index % 5 == 2) {
t.time = res;
}
else if (index % 5 == 3) {
t.amount = res;
}
}
//clear
j = 0;
//注意char数组的清空
memset(tmp_arr, 0, sizeof(tmp_arr) / sizeof(char));
index++;
}
else {
tmp_arr[j] = tmp;
j++;
}
}
i++;
}
return trans;
}
总结
写c++的时候一定要注意指针、数组这些,他们是直接和内存相关的,非常有可能出现**“你以为你用复用的方式修改了某个值并且赋给了其他值但其实你修改的是同一块内存的值,大家最后都一样都是指向那块内存的”**这种问题
一定要注意