1

我正在尝试将一些用 MATLAB 编写的代码移植到 C 中,这样我就可以编译该函数并更快地执行它(代码执行得非常频繁,它会带来显着的速度提升)。

所以基本上我的 MATLAB 代码所做的是它需要一个矩阵并将其转换为一个字符串,添加括号和逗号,所以我可以将它写入一个文本文件。这是一个关于向量 MyVec 如何工作的想法:

MyVec = rand(1,5);
NbVal = length(MyVec)
VarValueAsText = blanks(2 + NbVal*30 + (NbVal-1));
VarValueAsText([1 end]) = '[]';
VarValueAsText(1 + 31*(1:NbVal-1)) = ',';
for i = 1:NbVal
   VarValueAsText(1+(i-1)*31+(1:30)) = sprintf('%30.15f', MyVec(i));
end

现在,我怎样才能在 C 中获得类似的结果?这似乎并不难,因为我可以提前计算我的字符串(char 数组)的大小,并且我知道我需要写入内存区域的每个元素的位置。该sprintf函数也存在于 C 中。但是,我无法理解如何设置它,还因为我没有可以通过反复试验轻松学习的环境(每次尝试我都必须重新编译,这通常会导致分段错误和 MATLAB 崩溃...)。

我希望有人可以提供帮助,即使问题可能看起来微不足道,但我对 C 的经验很少,而且我无法找到合适的例子来开始......

4

2 回答 2

5

给定一个字符串的偏移量(以字节为单位),检索指向该偏移量的指针只需通过以下方式完成:

char *ptr = &string[offset];

如果您正在遍历矩阵的行来打印它们,您的循环可能如下所示:

char *ptr = output_buffer;
for (i = 0; i < n_lines; i++) {
    sprintf (ptr, "...", ...);
    ptr = &ptr[line_length];
}

不过,请确保您已为输出缓冲区分配了足够的内存。

于 2012-09-03T22:38:12.550 回答
4

请记住,sprintf它将在它打印的字符串的末尾放置一个字符串终止符,因此如果您“打印”到的字符串应该比您打印的字符串长,那么这将不起作用。

因此,如果您只想覆盖部分字符串,您可能应该使用sprintf临时缓冲区,然后使用memcpy将该缓冲区复制到实际字符串中。像这样的东西:

char temp[32];
sprintf(temp, "...", ...);

memcpy(&destination[position], temp, strlen(temp));
于 2012-09-04T06:43:28.887 回答