【问题标题】:Best method for Concatenating N strings of length L_N?连接长度为 L_N 的 N 个字符串的最佳方法?
【发布时间】:2013-08-04 03:33:22
【问题描述】:

我有 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. 对所有点重复。

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

【问题讨论】:

  • 你没有提到的一个主要问题是如何为字符串分配字符数组。
  • 我计算未来字符串的总长度并执行以下操作: char* newString = malloc(length)

标签: c algorithm


【解决方案1】:

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

【讨论】:

  • +1,当然强烈建议检查索引限制(不要超出缓冲区)和sprintf 结果的有效返回值(res > -1) .请参阅sprintf() 了解更多信息。
【解决方案2】:

以下代码应实现所需的字符串格式:

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 将使用超过计算的字符数,并且缓冲区将不够大。更好的算法可能会动态调整数组的大小,尤其是当您使用具有动态长度的数字格式时。

【讨论】:

    猜你喜欢
    • 2016-12-11
    • 2013-03-10
    • 2015-12-13
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多