【问题标题】:How to write into a char array in C at specific location using sprintf?如何使用 sprintf 在 C 中的特定位置写入 char 数组?
【发布时间】:2012-09-03 21:47:51
【问题描述】:

我正在尝试将一些用 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*4 矩阵),事情会更容易。 (您想使用磁盘文件作为中间存储,还是需要内存接口?)注意:在 C 语言中,sprintf() 将字符串/缓冲区作为第一个参数作为结果应该去的地方,我不要指望matlab在这方面有很大不同。注意 2:结果字符串中似乎没有分隔符(空格、制表符、逗号、换行符)。
  • 您好,感谢您的回复!不过,我不确定我是否理解您的评论:我输入的代码是 MATLAB 中的当前(工作)代码,我正在尝试将其移植到 C 中。实际上,我已经添加了第一行(带有随机输入) 作为样本输入。最后,我在 VarValuesAsString 中得到了我的“格式化值”...
  • 我对数学实验室一无所知。看起来好像您希望结果字符串为 [val1,val2,val3,...] 这是正确的吗?

标签: c arrays string matlab printf


【解决方案1】:

给定一个字符串的偏移量(以字节为单位),检索指向该偏移量的指针很简单:

char *ptr = &string[offset];

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

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

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

【讨论】:

  • 只要 sprintf 和 snprintf 成功,就会返回写入字符串的字符数。您也可以使用此返回值来计算偏移量。字符 *ptr = 输出缓冲区; positionToWrite += sprintf(positionToWrite, "...", ...);
【解决方案2】:

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

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

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

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

【讨论】:

  • 非常感谢您的见解!我已经成功地将变量写入最终字符串的正确位置,但输出字符串仅限于第一个元素:答案的关键确实是不包含字符串终止符!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-05
  • 2016-10-17
  • 2011-06-16
  • 2023-03-30
相关资源
最近更新 更多