0

我有 N 个字符串代表 (x,y,z) 中的点。我正在尝试使用以下形式创建一个包含所有点的字符串: [(x_0,y_0,z_0),(x_1,y_1,z_1),...,(x_n,y_n,z_n)]

以下是我正在尝试的方法,但如果觉得它变得过于复杂:

  1. 计算字符串中下一个点的开始。
  2. 使用 sprintf(string + index, point_i);
  3. 对所有点重复。

有没有更优雅的解决方案?

4

2 回答 2

2

sprintf返回“打印”的字符数(添加到字符串中),因此您可以从索引 0 开始,然后简单地添加每个 next 的结果sprintf (string + index, ..

于 2013-08-03T18:56:03.693 回答
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将使用超过计算的字符数,并且缓冲区不会足够大。更好的算法可能会动态调整数组的大小,特别是如果您使用具有动态长度的数字格式。

于 2013-08-03T19:19:46.813 回答