我有N个字符串表示(x,y,z)中的点。 我正在尝试使用以下形式创建一个包含所有点的字符串: [(X_0,y_0,Z_0),(X_1,Y_1,Z_1),...,(x_n,y_n,z_n)]
以下是我正在尝试的方法,但如果感觉它变得过于复杂:
有更优雅的解决方案吗?
答案 0 :(得分:2)
sprintf
返回'打印'字符数(添加到字符串中),因此您可以从索引0开始,然后只需添加每个sprintf (string + index, ..
的结果。
答案 1 :(得分:1)
以下代码应实现所需的字符串格式:
char* pathAsString(int nPoints, point3d_t* points)
{
int i, offset, buf_len;
char* buf;
buf_len = nPoints * 29 + 2;
buf = malloc(buf_len);
buf[0] = '[';
offset = 1;
for (i = 0; i < nPoints; i++) {
n = snprintf(buf + offset, buf_len - offset, "(%8.3f,%8.3f,%8.3f),",
points[i].x, points[i].y, points[i].z);
if (n < buf_len - offset)
return NULL; /* string buffer too small or other error */
offset += n;
}
if (offset + 1 >= buf_len)
return NULL; /* string buffer too small*/
buf[offset] = ']';
buf[offset+1] = 0;
return buf;
}
这与Jongware提出的方法基本相同。而不是sprintf
,它使用更安全的snprintf
来防止缓冲区溢出。
请注意,所需字符串长度的计算不是很强大。如果其中一个数字不符合8个字符(或您选择的任何字符),snprintf
将使用超过计算的字符数,缓冲区将不会足够大。一个更好的算法可能会动态调整数组的大小,特别是如果你使用动态长度的数字格式。