连接长度为L_N的N个字符串的最佳方法?

时间:2013-08-03 18:52:54

标签: c algorithm

我有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 个答案:

答案 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将使用超过计算的字符数,缓冲区将不会足够大。一个更好的算法可能会动态调整数组的大小,特别是如果你使用动态长度的数字格式。