2012-09-03 28 views
1

我想將一些用MATLAB編寫的代碼移植到C中,這樣我就可以編譯該函數並更快地執行它(代碼非常頻繁地執行,並且會帶來顯着的速度提升)。如何使用sprintf寫入特定位置的C中的char數組?

所以基本上我的MATLAB代碼是這樣的,它需要一個矩陣並將其轉換爲字符串,並添加括號和逗號,以便我可以將其寫入文本文件。下面是如何做到這一點的矢量myvec會工作的一個想法:

MyVec = rand(1,5); 
NbVal = length(MyVec) 
VarValueAsText = blanks(2 + NbVal*30 + (NbVal-1)); 
VarValueAsText([1 end]) = '[]'; 
VarValueAsText(1 + 31*(1:NbVal-1)) = ','; 
for i = 1:NbVal 
    VarValueAsText(1+(i-1)*31+(1:30)) = sprintf('%30.15f', MyVec(i)); 
end 

現在,我怎麼能達到類似的結果在C 2這似乎並不困難,因爲我可以預先計算我的字符串(char數組)的大小,並且知道每個元素的位置,我需要寫入我的內存區域。另外,在C中存在sprintf函數。但是,我很難理解如何設置它,也因爲我沒有一個可以通過反覆試驗很容易學習的環境(對於每次必須重新編譯的嘗試,通常都會導致到分割故障和MATLAB崩潰...)。

我希望有人能幫助,即使問題很可能看似微不足道,但我必須使用C的經驗非常少,我一直沒能找到合適的例子,從開始...

+0

也許如果你向我們展示一些樣本輸入(例如:一個4 * 4矩陣),事情會更容易。 (你是否想使用磁盤上的文件作爲中間存儲,或者你想要一個內存中的接口嗎?)注意:在C中,sprintf()的第一個參數是結果應該放到的字符串/緩衝區,I不要指望matlab在這方面有很大的不同。注2:結果字符串中沒有顯示分隔符(空格,製表符,逗號,換行符)。 – wildplasser

+0

嗨,感謝您的回覆!我不確定我是否理解你的評論,但是:我已經提出的代碼是MATLAB中的當前(工作)代碼,我試圖將它移植到C.實際上,我已經添加了第一行(隨機輸入)作爲示例輸入。最後,我在VarValuesAsString中獲得了我的「格式化值」... – Federico

+0

我對mathlab沒有任何瞭解。它看起來好像你想要結果字符串是'[val1,val2,val3,...]'這是正確的嗎? – wildplasser

回答

4

請記住,sprintf會在它打印的字符串的末尾放置一個字符串終止符,因此如果「打印」到的字符串應該比打印的字符串長,那麼這將不起作用。

所以如果你只是想覆蓋部分字符串,你應該使用sprintf來臨時緩衝區,然後使用memcpy將該緩衝區複製到實際的字符串中。就像這樣:

char temp[32]; 
sprintf(temp, "...", ...); 

memcpy(&destination[position], temp, strlen(temp)); 
+0

非常感謝您的見解!我已經成功地在最終字符串中的正確位置編寫了我的變量,但輸出字符串僅限於第一個元素:答案的關鍵確實不包括字符串終結符!!! – Federico

4

鑑於偏移量(以字節爲單位)轉換爲字符串,檢索到這個指針偏移做簡單地:

char *ptr = &string[offset]; 

如果你是通過你的矩陣的行迭代,以打印出來,你的循環可能看起來如下:

char *ptr = output_buffer; 
for (i = 0; i < n_lines; i++) { 
    sprintf (ptr, "...", ...); 
    ptr = &ptr[line_length]; 
} 

請確保您已經爲輸出緩衝區分配了足夠的內存。

+0

只要sprintf和snprintf成功,它們將返回寫入字符串的字符數。您也可以使用此返回值來計算偏移量。 char * ptr = output_buffer; positionToWrite + = sprintf(positionToWrite,「...」,...); – LucianNovo

相關問題