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

时间:2018-12-30 12:15:59

标签: c++

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

1

#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;
}

2 个答案:

答案 0 :(得分:1)

有任务

timecycles[numCycles] = buffer;

由于您只有一个buffer,因此使 all 指针指向相同缓冲区。

由于您使用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;
}

参考文献:

答案 1 :(得分:1)

基本问题是您对字符串的概念与C ++中的“字符数组”不匹配。特别是您认为,因为您以某种方式分配了timecycles[numCycles] = buffer;,所以char数组的char被复制了。但是在C ++中,所有要复制的内容都是一个指针,因此timecycles最终以多个指针指向同一缓冲区。更不用说退出readTimecycles函数时遇到的问题了。届时,您将有多个指向缓冲区的指针,该缓冲区不再存在,因为在退出readTimecycles函数时该缓冲区将被破坏。

解决此问题的方法是使用符合您期望的C ++代码。特别是std::string将按照您期望的方式进行复制。您可以通过以下方式更改代码以使用std::string

#include <string>

std::string timecycles[9];

timecycles[numCycles] = buffer; // now this really does copy a string