gpt4 book ai didi

c++ - sprintf 缓冲区问题,错误分配给 char 数组

转载 作者:行者123 更新时间:2023-11-28 01:25:42 24 4
gpt4 key购买 nike

我遇到了 sprintf 缓冲区的问题。正如您在下面的代码中看到的那样,我使用 sprintf 将一个字符数组保存到缓冲区中,因此 pFile 可以检查文件夹中是否有这样命名的文件。如果找到,缓冲区值将分配给 timecycles[numCycles],并且 numCycles 将增加。示例:timecycles[0] = "timecyc1.dat"。它运行良好,正如您在控制台输出中看到的那样,它识别出文件夹中只有 timecyc1.dat 和 timecyc5.dat。但只要我想用 for 循环读取时间周期,两个索引的值都是“timecyc9.dat”,尽管对于时间周期[0]它应该是“timecyc1.dat”,对于时间周期1应该是“timecyc5.dat” .第二件事是,我如何编写代码以便 readTimecycles() 返回 char* 时间周期,我可以在主函数中使用 char* timecycles[9] = readTimecycles() 或类似的东西初始化它?

Console output

#include <iostream>
#include <cstdio>

char* timecycles[9];

void readTimecycles()
{
char buffer[256];
int numCycles = 0;
FILE* pFile = NULL;

for (int i = 1; i < 10; i++)
{
sprintf(buffer, "timecyc%d.dat", i);
pFile = fopen(buffer, "r");

if (pFile != NULL)
{
timecycles[numCycles] = buffer;
numCycles++;
std::cout << buffer << std::endl; //to see if the buffer is correct
}

}
for (int i = 0; i < numCycles; i++)
{
std::cout << timecycles[i] << std::endl; //here's the issue with timecyc9.dat
}
}

int main()
{
readTimecycles();

return 0;
}

最佳答案

随着作业

timecycles[numCycles] = buffer;

您使所有 指针指向相同 缓冲区,因为您只有一个缓冲区

由于您使用 C++ 编程,您可以通过使用 std::string 轻松解决您的问题。


如果我将您的代码重新编写成更像 C++ 而不是更像 C 的代码,它可能看起来像这样

std::array<std::string, 9> readTimeCycles()
{
std::array<std::string, 9> timecycles;

for (size_t i = 0; i < timecycles.size(); ++i)
{
// Format the file-name
std::string filename = "timecyc" + std::to_string(i + 1) + ".dat";

std::ifstream file(filename);
if (file)
{
// File was opened okay
timecycles[i] = filename;
}
}

return timecycles;
}

引用资料:

关于c++ - sprintf 缓冲区问题,错误分配给 char 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53977499/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com