这段代码有何问题cities* citiesArray(FILE* Fp) { if (!opencsv1(Fp)) { cout << "error for opening" << endl; return NULL; } int nLine = Line_n(Fp); char* pcLine = NULL; char* cFinal = NULL; struct cities* pCity = new cities[nLine]; char cLine[256] = { 0 }; fseek(Fp, 0, 0); for (int j = 0; j < nLine; j++) { pcLine = fgets(cLine, 256, Fp); cFinal = strtok(pcLine, ","); while (cFinal != NULL) { strcpy(pCity[j].cNation, cFinal); cFinal = strtok(NULL, ","); strcpy(pCity[j].cCity, cFinal); cFinal = strtok(NULL, ","); pCity[j].dLatitude = atof(cFinal); cFinal = strtok(NULL, ","); pCity[j].dLongitude = atof(cFinal); cFinal = strtok(NULL, ","); } } return pCity; }
时间: 2024-01-04 17:03:27 浏览: 63
C++array介绍及详细使用示例(源代码)
这段代码可能存在以下问题:
1. 函数返回类型应该为 `cities*` 而非 `citiesArray`,可能是笔误。
2. 函数内部定义的 `struct cities* pCity` 数组没有释放,存在内存泄漏的风险。
3. 读取文件内容时,如果一行中逗号数量不足 3 个,会导致程序崩溃或者结果不正确。
4. 读取文件内容时,逗号后面的字段如果包含空格或其他特殊字符,可能会导致结果不正确。
5. 函数内部使用了 C 风格字符串处理函数 `strcpy` 和 `strtok`,可能存在缓冲区溢出的风险。
建议改进的地方:
1. 修改返回类型为 `cities*`。
2. 添加释放 `pCity` 数组内存的代码。
3. 使用更加健壮的文件读取方式,例如使用 C++ 的 `std::ifstream` 或者第三方库。
4. 使用更加健壮的字符串处理方式,例如使用 C++11 的 `std::string` 和 `std::getline`。
5. 添加足够的容错机制,例如判断读取的字段数是否符合预期,判断字符串长度是否超出预期。
阅读全文