将字符串传递给遗留函数的最佳方法,将char数组作为参数

时间:2017-04-20 10:21:05

标签: c++ arrays stdstring

假设我们有一个c样式的遗留函数,它填充了一个带有文件名作为参数传递的char数组,我们无法重构它。另一方面,调用函数现在使用std :: string。

将调用函数的字符串传递给遗留函数的标准/最佳方法是什么?

我通常看到的是在调用函数中创建临时char数组,在调用遗留函数时用作参数,然后使用char数组设置std :: string(源代码中的方法1)下文)。

我想知道我是否可以安全地避免创建临时字符数组而是直接使用字符串。我尝试了几种方法(下面的方法2到6),方法4对我来说似乎很好,但我不确定我是否在安全性/可靠性方面缺少某些东西。有更好的解决方案吗?

此外,我还不确定在将方法5设置为FILENAME_SIZE时方法4工作的原因,方法5不起作用,而我必须使用FILENAME_SIZE - 1(方法6)。< / p>

#include <cstring>
#include <iostream>

// Suppose that filenames are hardcoded to 20 characters
const std::size_t FILENAME_SIZE = 21;

// Suppose that we have a legacy function to get a filename
// and suppose that the legacy function handles correctly the filename max size
// based on FILENAME_SIZE
void getFilename(char* anArray)
{
    // write the filename into anArray
    // for this test, i use strncp
    strncpy(anArray, "123456789", FILENAME_SIZE - 1);
}

int main()
{
    // Method 1 -> OK
    std::string aString1;
    char anArray1[FILENAME_SIZE] = {};

    getFilename(anArray1);
    aString1 = anArray1;

    std::cout << "Method 1" << std::endl;
    std::cout << anArray1 << "/" << std::endl;
    std::cout << aString1 << "/" << std::endl;

    // Method 2 -> KO
    std::string aString2;

    getFilename(&aString2[0]);

    std::cout << "Method 2" << std::endl;
    std::cout << aString2 << "/" << std::endl;

    // Method 3 -> KO
    std::string aString3;
    aString3.reserve(FILENAME_SIZE);

    getFilename(&aString3[0]);

    std::cout << "Method 3" << std::endl;
    std::cout << aString3 << "/" << std::endl;

    // Method 4 -> OK
    std::string aString4;
    aString4.resize(FILENAME_SIZE);

    getFilename(&aString4[0]);

    std::cout << "Method 4" << std::endl;
    std::cout << aString4 << "/" << std::endl;

    // Method 5 -> KO
    std::string aString5 = std::string(FILENAME_SIZE, '0');

    getFilename(&aString5[0]);

    std::cout << "Method 5" << std::endl;
    std::cout << aString5 << "/" << std::endl;

    // Method 6 -> OK
    std::string aString6 = std::string(FILENAME_SIZE-1, '0');

    getFilename(&aString6[0]);

    std::cout << "Method 6" << std::endl;
    std::cout << aString6 << "/" << std::endl;

    return 0;
}

输出:

Method 1
123456789/
123456789/
Method 2
/
Method 3
/
Method 4
123456789/
Method 5
1234567890/
Method 6
123456789/

0 个答案:

没有答案