我有 N 个字符串代表 (x,y,z) 中的点。我正在尝试使用以下形式创建一个包含所有点的字符串: [(x_0,y_0,z_0),(x_1,y_1,z_1),...,(x_n,y_n,z_n)]
以下是我正在尝试的方法,但如果觉得它变得过于复杂:
- 计算字符串中下一个点的开始。
- 使用 sprintf(string + index, point_i);
- 对所有点重复。
有没有更优雅的解决方案?
sprintf
返回“打印”的字符数(添加到字符串中),因此您可以从索引 0 开始,然后简单地添加每个 next 的结果sprintf (string + index, ..
。
以下代码应实现所需的字符串格式:
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
将使用超过计算的字符数,并且缓冲区不会足够大。更好的算法可能会动态调整数组的大小,特别是如果您使用具有动态长度的数字格式。