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

如何使用sprintf在C中的特定位置写入字符数组?,c,arrays,string,matlab,printf,C,Arrays,String,Matlab,Printf,我正在尝试将一些用MATLAB编写的代码移植到C中,这样我就可以编译函数并更快地执行它(代码执行得非常频繁,这将显著提高速度) 基本上我的MATLAB代码就是这样做的,它取一个矩阵,把它转换成一个字符串,加上括号和逗号,这样我就可以把它写到一个文本文件中。下面是一个如何为向量MyVec工作的想法: MyVec = rand(1,5); NbVal = length(MyVec) VarValueAsText = blanks(2 + NbVal*30 + (NbVal-1)); VarValue

我正在尝试将一些用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语言中获得类似的结果?这似乎不太难,因为我可以提前计算字符串(字符数组)的大小,并且知道需要写入内存区域的每个元素的位置。C中也有
sprintf
函数。但是,我很难理解如何设置它,这也是因为我没有一个可以通过尝试和错误轻松学习的环境(每次尝试我都必须重新编译,这通常会导致分段错误和MATLAB崩溃…)

我希望有人能提供帮助,尽管这个问题可能看起来很小,但我对C的经验很少,而且我还没有找到合适的例子来开始…

给定一个偏移量(以字节为单位)到字符串中,检索指向该偏移量的指针只需使用:

char *ptr = &string[offset];
如果您正在迭代矩阵中的行以打印它们,则循环可能如下所示:

char *ptr = output_buffer;
for (i = 0; i < n_lines; i++) {
    sprintf (ptr, "...", ...);
    ptr = &ptr[line_length];
}
char*ptr=输出缓冲区;
对于(i=0;i
不过,请确保为输出缓冲区分配了足够的内存。

如果将偏移量(以字节为单位)设置为字符串,则只需使用以下命令即可检索指向该偏移量的指针:

char *ptr = &string[offset];
如果您正在迭代矩阵中的行以打印它们,则循环可能如下所示:

char *ptr = output_buffer;
for (i = 0; i < n_lines; i++) {
    sprintf (ptr, "...", ...);
    ptr = &ptr[line_length];
}
char*ptr=输出缓冲区;
对于(i=0;i

但是,请确保为输出缓冲区分配了足够的内存。

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

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

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

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

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

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

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

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

也许如果你给我们看一些输入样本(比如:一个4*4的矩阵),事情会更简单。(您是想使用磁盘上的文件作为中间存储,还是想要内存中的接口?)注意:在C中,sprintf()的第一个参数是结果应该放在哪里的字符串/缓冲区,我不希望matlab在这方面有很大的不同。注2:结果字符串中似乎没有分隔符(空格、制表符、逗号、换行符)。您好&感谢您的回复!我不确定我是否理解你的评论:我输入的代码是MATLAB中的当前(工作)代码,我正在尝试将其移植到C。实际上,我添加了第一行(带有随机输入)作为示例输入。最后我得到了varvaluesassString中的“格式化值”…我对mathlab一无所知。似乎您希望得到的字符串是
[val1,val2,val3,…]
这是否正确?如果您向我们展示一些示例输入(例如:4*4矩阵),事情会更简单。(您是想使用磁盘上的文件作为中间存储,还是想要内存中的接口?)注意:在C中,sprintf()的第一个参数是结果应该放在哪里的字符串/缓冲区,我不希望matlab在这方面有很大的不同。注2:结果字符串中似乎没有分隔符(空格、制表符、逗号、换行符)。您好&感谢您的回复!我不确定我是否理解你的评论:我输入的代码是MATLAB中的当前(工作)代码,我正在尝试将其移植到C。实际上,我添加了第一行(带有随机输入)作为示例输入。最后我得到了varvaluesassString中的“格式化值”…我对mathlab一无所知。似乎您希望生成的字符串是
[val1,val2,val3,…]
这是否正确?非常感谢您的见解!我成功地在最后一个字符串中的正确位置写入了变量,但输出字符串仅限于第一个元素:答案的关键是不包括字符串终止符!!!非常感谢您的见解!我成功地在最后一个字符串中的正确位置写入了变量,但输出字符串仅限于第一个元素:答案的关键是不包括字符串终止符!!!只要sprintf和snprintf成功,它们就会返回写入字符串的字符数。也可以使用此返回值计算偏移量。char*ptr=输出缓冲区;positionToWrite+=sprintf(positionToWrite,“…”,…);只要sprintf和snprintf成功,它们就会返回写入字符串的字符数。也可以使用此返回值计算偏移量。char*ptr=输出缓冲区;positionToWrite+=sprintf(positionToWrite,“…”,…);