2014-01-22 163 views
-1

當我在C++中連接時遇到了麻煩,我有一個浮點數值轉換爲字符數組,然後我嘗試在該值前追加一些文本,但即時獲取「 ?」作爲輸出,下面的代碼:字符串與sprintf連接

int sensorValue = analogRead(A0); 
float voltage= sensorValue * (5.0/421.0); 
char v[6]; 
dtostrf(voltage, 6, 2, v); 
sprintf(_outbuffer, "VL%s", v); 
Serial.println(v); 
Serial.println(_outbuffer); 
+3

您確定您不打算將其標記爲'C'嗎? – bstamour

+2

你爲什麼用這個'dtostrf()'函數打擾?你應該可以做'sprintf(_outbuffer,「VL%6.2f」,voltage);'(你可能需要弄亂那個格式說明符才能以你想要的方式顯示浮點數)。另外考慮使用'snprintf()',這樣你不會溢出'_outbuffer'。 – Praetorian

+1

實際確定[tag:c]或[tag:C++] !!下壓壓力,因爲它的問題不適合[標籤:C++] ...任何你不能使用'std :: string'或其他C++標準庫類的原因,如上所述? –

回答

2

字符串連接在容易,只需使用+操作:

std::string s1("Hello"); 
std::string s2("World"); 
std::string concat = s1 + s2; // concat will contain "HelloWorld" 

如果需要高級格式或數字格式,你可以使用std::ostringstream等級:

std::ostringstream oss; 
oss << 1 << "," << 2 << "," << 3 << ", Hello World!"; 
std::string result = oss.str(); // result will contain "1,2,3, Hello World!" 

因此,對於您的情況,您可以使用這樣的:

int sensorValue = analogRead(A0); 
float voltage = sensorValue * (5.0/421.0); 
std::ostringstream oss; 
oss << std::fixed << std::setw(6) << std::setprecision(2) << voltage; 
std::string v = oss.str(); 
std::string _outbuffer = "VL" + v; 
Serial.println(v.c_str()); 
Serial.println(_outbuffer.c_str()); 

注:
要使用的iostream操縱功能(如提及std::setw()等),你需要#include <iomanip>除了#include <ostringstream>

+0

@RemyLebeau THX,很好的答案。那時我太懶惰了,希望一個> 2000的代表用戶能夠應付插值...... –

+1

我不關注代表,你永遠不知道誰會在將來看到它。 –

+0

@RemyLebeau公平的論點... –

0

嘗試strcat的

char v[15 + 1]; 
v[15] = 0; 
dtostrf(voltage, 6, 2, v); 
strcpy(_outbuffer, "VL"); 
strcat(_outbuffer, v); 

另外,作爲suspectus建議,用sprintf。