2013-08-03 60 views
0

我有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個串的最佳方法?

以下是我想的方法,但如果覺得這過於複雜的獲取:

  1. 計算字符串中的下一個點的開始。
  2. 使用sprintf(string + index,point_i);
  3. 重複所有點。

有沒有更優雅的解決方案?

+0

你沒有提到的一個主要問題是如何爲字符串分配字符數組。 – Codo

+0

我計算未來字符串的總長度,並執行以下操作: char * newString = malloc(length) –

回答

2

sprintf返回打印字符的數量(添加到字符串中),因此您可以從索引0開始,然後簡單地添加每個下一個的結果sprintf (string + index, ..

+0

+1,當然,檢查索引限制(不超出緩衝區)和有效返回值('res> -1')的'sprintf'結果是*高度推薦的。有關更多信息,請參閱['sprintf()'](http://en.cppreference.com/w/c/io/fprintf)。 – WhozCraig

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建議,以及同樣的做法。它使用更安全的snprintf來代替sprintf來防止緩衝區溢出。

請注意,所需的字符串長度的計算不是很健壯。如果其中一個數字不符合8個字符(或您選擇的任何內容),則snprintf將使用超過計算的字符數,並且緩衝區不夠大。更好的算法可能會動態調整數組的大小,特別是如果您使用動態長度的數字格式。

相關問題