-1

我有一个将常量 char * 作为输入的 API 函数。我必须创建一个分隔的文本文件,它是函数的输入,例如:

193.875 0.0     0.0     2
193.876 0.0     0.0     2
193.877 0.0     0.0     2
193.878 0.0     0.0     2
193.879 0.0     0.0     2
193.880 0.0     0.0     2
193.881 0.0     0.0     2

该软件的支持人员告诉我,我可以使用sprintf()创建和保存此文件的每一行,所以我使用它:

sprintf(wsp,"%.3f\t0.0\t0.0\t%d\n", start_freq, z);

并将这一行放入循环后,我将每个创建的 wsp 保存在一个字符串数组中:

for (int j = 0; j < start; j++){

sprintf(wsp,"%.3f\t0.0\t0.0\t%d\n", start_freq, z);
start_freq = start_freq + 0.001;
wspfile[j] = wsp;

}

现在我有一个具有所需格式的文件,但包含在字符串数组中。我的问题是创建数组后如何将此数组作为常量 char *传递,或者如何将其转换为常量 char *

4

3 回答 3

1

您可以使 wspFile 成为 std::string 而不是数组。然后代替

wspFile[j]=wsp;

你将会拥有

wspFile+=wsp;

然后得到你会调用的 const char* 版本

wspFile.c_str();
于 2012-08-19T13:50:15.927 回答
0

您似乎预先知道数据的大小,因此您可以这样做:

std::vector<char> wspfile(start * wsp_max_length);
// C-ish way:
/* char* wspfile = (char*) malloc(start * wsp_max_length) */

for (int j = 0; j < start; j++) {
    sprintf(wsp + (wsp_max_length * j), "%.3f\t0.0\t0.0\t%d\n", start_freq, z);
    start_freq = start_freq + 0.001;
}

your_API_func(&wspfile[0]);

在更多类似 C++ 的时尚中:

#include <vector>
#include <sstream>
#include <string>
#include <iomanip>  // for setprecision()

std::vector<char> wspfile;
double start_freq = 193.875;

for (int j = 0; j < start; ++j, start_freq += 0.0001) {

    std::ostringstream oss;
    oss << std::setprecision(3)
        << start_freq
        << "\t0.0\t0.0\t"
        << z << "\n\0";  // your version with sprintf adds '\0', too,
                         // although I'm pretty sure you don't want it

    std::string wsp = oss.str();
    wspfile.insert(wspfile.end(), wsp.begin(), wsp.end());
}

your_API_func(&wspfile[0]);
于 2012-08-19T13:59:54.163 回答
0

我希望我没有误解你的问题。我开始假设我有一个 N 数组char*,即wspfile[],对吗?现在,我想将此数组转换为单个字符串:

char *join(char **strings, int N)
{
    //Step 1: find out the total amount of memory we need
    int i, total = 0;
    for (i = 0; i < N; i++) {
        total += strlen(strings[i]);
    }

    //Step 2. Allocate resulting string.
    char *str = malloc(total + 1); //Alloc 1 more byte for end \0

    //Step 3. Join strings.
    char *dst = str;
    for (i = 0; i < N; i++) {
        char *src = strings[i];
        while(*src) *dst++ = *src++;
    }
    *dst = 0; //end \0
    return str; //don't forget to free(str) !
}

然后,在您的代码中:

char *s = join(wspfile, N);
/* do whatever with `s`*/
free(s);
于 2012-08-19T14:08:07.540 回答