我有N個字符串代表(x,y,z)中的點。 我想用以下形式創建一個包含我所有點的字符串: [(x_0,y_0,z_0),(x_1,y_1,z_1),...,(x_n,y_n,z_n)]串聯長度爲L_N的N個串的最佳方法?
以下是我想的方法,但如果覺得這過於複雜的獲取:
- 計算字符串中的下一個點的開始。
- 使用sprintf(string + index,point_i);
- 重複所有點。
有沒有更優雅的解決方案?
我有N個字符串代表(x,y,z)中的點。 我想用以下形式創建一個包含我所有點的字符串: [(x_0,y_0,z_0),(x_1,y_1,z_1),...,(x_n,y_n,z_n)]串聯長度爲L_N的N個串的最佳方法?
以下是我想的方法,但如果覺得這過於複雜的獲取:
有沒有更優雅的解決方案?
sprintf
返回打印字符的數量(添加到字符串中),因此您可以從索引0開始,然後簡單地添加每個下一個的結果sprintf (string + index, ..
。
+1,當然,檢查索引限制(不超出緩衝區)和有效返回值('res> -1')的'sprintf'結果是*高度推薦的。有關更多信息,請參閱['sprintf()'](http://en.cppreference.com/w/c/io/fprintf)。 – WhozCraig
下面的代碼應該達到預期的字符串格式化:
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建議,以及同樣的做法。它使用更安全的snprintf
來代替sprintf
來防止緩衝區溢出。
請注意,所需的字符串長度的計算不是很健壯。如果其中一個數字不符合8個字符(或您選擇的任何內容),則snprintf
將使用超過計算的字符數,並且緩衝區不夠大。更好的算法可能會動態調整數組的大小,特別是如果您使用動態長度的數字格式。
你沒有提到的一個主要問題是如何爲字符串分配字符數組。 – Codo
我計算未來字符串的總長度,並執行以下操作: char * newString = malloc(length) –