2011-05-24 63 views
2

我有一個艱難的時間搞清楚如何讓這個結構數組顯示爲單個字符串「c_str」,當我使用printf函數。到目前爲止,我只能將c_str作爲行結構數組的一部分,在本例中爲第24行。當我使用print(c_str);我希望輸出顯示代碼中的所有數據。它需要存儲爲一個字符串,因爲我有一個需要訪問n,m,gnm,hnm,dgnm和dhnm的函數。如何獲得一個結構數組作爲單個字符串

感謝您的幫助

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <math.h> 

int main() 
{ 
int i=0,n[90],m[90]; 
float gnm[90],hnm[90],dgnm[90],dhnm[90]; 
static char c_str[90]; 

     struct wmm 
    { 
    int n; 
    int m; 
    float gnm; 
    float hnm; 
    float dgnm; 
    float dhnm; 
    } book[90]= {{1, 0, -29496.6,  0.0,  11.6,  0.0}, 
    {1, 1, -1586.3, 4944.4,  16.5,  -25.9}, 
    {2, 0, -2396.6,  0.0,  -12.1,  0.0}, 
    {2, 1, 3026.1, -2707.7,  -4.4,  -22.5}, 
    {2, 2, 1668.6, -576.1,  1.9,  -11.8}, 
    {3, 0, 1340.1,  0.0,  0.4,  0.0}, 
    {3, 1, -2326.2, -160.2,  -4.1,  7.3}, 
    {3, 2, 1231.9,  251.9,  -2.9,  -3.9}, 
    {3, 3, 634.0,  -536.6,  -7.7,  -2.6}, 
    {4, 0, 912.6,  0.0,  -1.8,  0.0}, 
    {4, 1, 808.9,  286.4,  2.3,  1.1}, 
    {4, 2, 166.7,  -211.2,  -8.7,  2.7}, 
    {4, 3, -357.1,  164.3,  4.6,  3.9}, 
    {4, 4,  89.4,  -309.1,  -2.1,  -0.8}, 
    {5, 0, -230.9,  0.0,  -1.0,  0.0}, 
    {5, 1, 357.2,  44.6,  0.6,  0.4}, 
    {5, 2, 200.3,  188.9,  -1.8,  1.8}, 
    {5, 3, -141.1,  -118.2,  -1.0,  1.2}, 
    {5, 4, -163.0,  0.0,  0.9,  4.0}, 
    {5, 5,  -7.8,  100.9,  1.0,  -0.6}, 
    {6, 0,  72.8,  0.0,  -0.2,  0.0}, 
    {6, 1,  68.6,  -20.8,  -0.2,  -0.2}, 
    {6, 2,  76.0,  44.1,  -0.1,  -2.1}, 
    {6, 3, -141.4,  61.5 ,  2.0,  -0.4}, 
    {6, 4, -22.8,  -66.3,  -1.7,  -0.6}, 
    {6, 5,  13.2,  3.1,  -0.3,  0.5}, 
    {6, 6, -77.9,  55.0,  1.7,  0.9}, 
    {7, 0,  80.5,  0.0,  0.1,  0.0}, 
    {7, 1,  -75.1,  -57.9,  -0.1,  0.7}, 
    {7, 2,  -4.7,  -21.1,  -0.6,  0.3}, 
    {7, 3,  45.3,  6.5,  1.3,  -0.1}, 
    {7, 4,  13.9,  24.9,  0.4,  -0.1}, 
    {7, 5,  10.4,  7.0,  0.3,  -0.8}, 
    {7, 6,  1.7,  -27.7,  -0.7,  -0.3}, 
    {7, 7,  4.9,  -3.3,  0.6,  0.3}, 
    {8, 0,  24.4,  0.0,  -0.1,  0.0}, 
    {8, 1,  8.1,  11.0,  0.1,  -0.1}, 
    {8, 2,  -14.5,  -20.0,  -0.6,  0.2}, 
    {8, 3,  -5.6,  11.9,  0.2,  0.4}, 
    {8, 4,  -19.3,  -17.4,  -0.2,  0.4}, 
    {8, 5,  11.5,  16.7,  0.3,  0.1}, 
    {8, 6,  10.9,  7.0,  0.3,  -0.1}, 
    {8, 7,  -14.1,  -10.8,  -0.6,  0.4}, 
    {8, 8,  -3.7,  1.7,  0.2,  0.3}, 
    {9, 0,  5.4,  0.0,  0.0,  0.0}, 
    {9, 1,  9.4,  -20.5,  -0.1,  0.0}, 
    {9, 2,  3.4,  11.5,  0.0,  -0.2}, 
    {9, 3,  -5.2,  12.8,  0.3,  0.0}, 
    {9, 4,  3.1,  -7.2,  -0.4,  -0.1}, 
    {9, 5,  -12.4,  -7.4,  -0.3,  0.1}, 
    {9, 6,  -0.7,  8.0,  0.1,  0.0}, 
    {9, 7,  8.4,  2.1,  -0.1,  -0.2}, 
    {9, 8,  -8.5,  -6.1,  -0.4,  0.3}, 
    {9, 9,  -10.1,  7.0,  -0.2,  0.2}, 
    {10, 0,  -2.0,  0.0,  0.0,  0.0}, 
    {10, 1,  -6.3,  2.8,  0.0,  0.1}, 
    {10, 2 ,  0.9 ,  -0.1 ,  -0.1 ,  -0.1}, 
    {10, 3,  -1.1,  4.7,  0.2,  0.0}, 
    {10, 4,  -0.2,  4.4,  0.0,  -0.1}, 
    {10, 5,  2.5,  -7.2,  -0.1,  -0.1}, 
    {10, 6,  -0.3,  -1.0 ,  -0.2 ,  0.0}, 
    {10, 7,  2.2,  -3.9,  0.0,  -0.1}, 
    {10, 8,  3.1,  -2.0,  -0.1,  -0.2}, 
    {10, 9,  -1.0,  -2.0,  -0.2,  0.0}, 
    {10, 10,  -2.8,  -8.3,  -0.2,  -0.1}, 
    {11, 0,  3.0,  0.0,  0.0,  0.0}, 
    {11, 1,  -1.5,  0.2,  0.0,  0.0}, 
    {11, 2,  -2.1,  1.7,  0.0,  0.1}, 
    {11, 3,  1.7,  -0.6,  0.1,  0.0}, 
    {11, 4,  -0.5,  -1.8,  0.0,  0.1}, 
    {11, 5,  0.5,  0.9,  0.0,  0.0}, 
    {11, 6,  -0.8,  -0.4,  0.0,  0.1}, 
    {11, 7,  0.4,  -2.5,  0.0,  0.0}, 
    {11, 8,  1.8,  -1.3,  0.0,  -0.1}, 
    {11, 9,  0.1,  -2.1,  0.0,  -0.1}, 
    {11, 10,  0.7,  -1.9,  -0.1,  0.0}, 
    {11, 11,  3.8,  -1.8,  0.0,  -0.1}, 
    {12, 0,  -2.2,  0.0,  0.0,  0.0}, 
    {12, 1,  -0.2,  -0.9,  0.0,  0.0}, 
    {12, 2,  0.3,  0.3,  0.1,  0.0}, 
    {12, 3,  1.0 ,  2.1 ,  0.1 ,  0.0}, 
    {12, 4,  -0.6,  -2.5,  -0.1,  0.0}, 
    {12, 5,  0.9,  0.5,  0.0,  0.0}, 
    {12, 6,  -0.1,  0.6,  0.0,  0.1}, 
    {12, 7,  0.5,  0.0,  0.0,  0.0}, 
    {12, 8,  -0.4,  0.1,  0.0,  0.0}, 
    {12, 9,  -0.4,  0.3,  0.0,  0.0}, 
    {12, 10,  0.2,  -0.9,  0.0,  0.0}, 
    {12, 11,  -0.8,  -0.2,  -0.1,  0.0}, 
    {12, 12,  0.0,  0.9,  0.1,  0.0}}; 


sprintf(c_str, " %d %d %lf %lf %lf %lf" ,book[25].n, book[25].m , book[25].gnm , book[25].hnm, book[25].dgnm, book[25].dhnm); 

    getchar(); 
    return 0; 

} 

回答

2

如果你想在所有的結構中的數據複製到c_str,你只需要在一個循環來包裝sprintf()。請注意,您應切換到snprintf()以避免意外引入緩衝區溢出。

由於sprintf()snprintf()返回它們添加到字符串的字符數,你可以輕鬆地跟蹤字符串中的下一個未使用的位置:

int i, n = 90, buf_size = 90, offset = 0; 
for (i = 0; i < n && offset < buf_size; ++i) { 
    offset += snprintf(c_str + offset, buf_size - offset, " %d %d %lf %lf %lf %lf", book[i].n, book[i].m , book[i].gnm , book[i].hnm, book[i].dgnm, book[i].dhnm); 
} 

如果你要反覆傳遞c_str作爲第一個參數,它只包含最後一行。

+0

差不多+1,但是你不會在每次調用時適當地減少buf_size ... – 2011-05-24 17:21:30

+0

它的工作,非常感謝你!我之前用sprintf()試過,而且我得到了緩衝區溢出,所以看起來snprintf()的確有用。再次感謝! – officerkrupke 2011-05-24 17:24:17

+0

@Oli:很好。我剛剛編輯我的答案來修復這個錯誤,@officerkrupke:很高興它的工作! – 2011-05-24 17:35:54

相關問題