如何使用sprintf在特定位置写入C中的char数组?

时间:2012-09-03 21:47:51

标签: c arrays string matlab printf

我正在尝试将一些用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的经验很少,而且我还没有找到合适的例子来开始...

2 个答案:

答案 0 :(得分:4)

给定字符串的偏移量(以字节为单位),只需使用以下命令检索指向此偏移量的指针:

char *ptr = &string[offset];

如果您正在迭代矩阵的行来打印它们,那么您的循环可能如下所示:

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

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

答案 1 :(得分:4)

请记住,sprintf会将字符串终止符放在它打印的字符串的末尾,因此如果您“打印”的字符串应该比您打印的字符串长,那么这将无效。

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

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

memcpy(&destination[position], temp, strlen(temp));