2013-04-10 127 views
0

我正在編寫一個Arduino庫,用於使用串行饋送在Arduino和計算機之間進行簡單的數據傳輸。我創建了庫等。但是,我遇到了一個char數組問題,並添加了一個冒號(':')。也就是說,在C++中向一個無符號字符添加冒號(:)

//Sends data via println() 
void simpleTransfer::sendData(char *name, char *data){ 
    char *str = name + ": " + data + ","; 
    _serial->println(str); //Sends in form 'name: data,' 
} 

這應該是我要發送,添加一個冒號和一個空格,我要發送的數據和最後一個逗號變量的名稱。不過,我不是得到錯誤信息:

的類型 '字符*' 無效的操作數和 '爲const char [3]' 二進制 '運營商+'

的原因是什麼?

+2

您正在尋找*字符串連接*。添加兩個指針不會那樣做。 – 2013-04-10 16:45:30

+0

感謝您的幫助 – jacobsax 2013-04-11 08:35:25

回答

2

你可以使用sprintf

char str[64]; // Or whatever length you need to fit the resulting string 
sprintf(str, "%s:%s,", name, data); 

或者strcpy/strcat

char str[64]; 
strcpy(str, name); 
strcat(str, ":"); 
strcat(str, data); 
strcat(str, ","); 


或者只是使用C++的std::string

+0

與上面相同的註釋:'std :: string'不適用於Arduino。 'sprintf'方法更好,但需要拉入某些庫,這會顯着增加代碼的大小,這在Arduino中也是不可取的 – angelatlarge 2013-04-11 02:32:44

3

簡答題:使用std::string來創建連接字符串。

std::string s = ((std::string(name) + ": ") + data) + ","; 
_serial->println(s.c_str()); 

長答案:連接C風格的字符串時,您需要一個足夠大的目標緩衝區來保存結果。如果您知道結果可以達到的最大大小,則可以聲明該大小的本地數組,並使用sprintf作爲其他答案的解釋。或者,如果您事先不知道大小,則可以使用strlennew[]的組合來分配動態大小的緩衝區,執行打印,然後執行delete[]的緩衝區。但不要這樣做!改爲使用字符串類別std::string,或者在下面的評論中提及Drew Dormann,Arduino專有String類。

+1

......從我所知道的來看,Arduino的C++實現沒有頭文件'',但提供了一個'String'類型來支持您編寫的語法。如果我錯了,請糾正我,任何人。 :) – 2013-04-10 16:54:40

+0

@DrewDormann:哦,我不知道Arduino有那個! http://arduino.cc/en/Reference/StringObject – 2013-04-10 17:01:11

+0

你真的不想在Arduino上使用標準C++庫:這是一個低資源平臺。出於這個原因,它有自己的字符串實現。 – angelatlarge 2013-04-11 02:31:27