[英]string::c_str() and string::data() not working for conversion to const char*
[英]String to const char conversion using c_str() or toCharArray()?
我想了解更多關於編程的知識,經過一番谷歌搜索后,我找到了如何將字符串轉換為 const char 的方法。
String text1;
我不明白的是為什么 c_str() 有效,
const char *text2 = text1.c_str();
與 toCharArray() 相反?
const char *text2 = text1.toCharArray();
或者
const char text2 = text1.toCharArray();
后者對我來說更合乎邏輯,因為我想將字符串轉換為字符,然后將其轉換為常量字符。 但這不起作用,因為一個是字符串,另一個是字符。 據我了解,前者將字符串轉換為 C 類型字符串,然后將其轉換為 const char。 在這里,字符串突然不再是問題了 oO
.
a) 為什么它需要一個 C 類型的字符串轉換,為什么它才起作用?
b) 為什么需要指針?
c) 為什么簡單的 toCharArray() 不起作用?
.
還是我做錯了什么?
謝謝堆。
我在 Arduino 平台上使用 PlatformIO。
String
后保留它,您應該使用toCharArray
。c_str
。 String.toCharArray()
Arduino 參考
toCharArray
的接口(和實現)如下所示,來自源碼
void toCharArray(char *buf, unsigned int bufsize, unsigned int index=0) const
{ getBytes((unsigned char *)buf, bufsize, index); }
所以你的第一個問題是你試圖錯誤地使用它。 toCharArray
會將String
的底層字符復制到您提供的緩沖區中。 這必須是您分配的額外空間,無論是在堆棧上的緩沖區中,還是在其他一些可寫的內存區域中。 你會這樣做。
String str = "I am a string!";
char buf[5];
str.toCharArray(buf, 5);
// buf is now "I am\0"
// or you can start at a later index, here index 5
str.toCharArray(buf, 5, 5);
// buf is now "a st\0"
// we can also change characters in the buffer
buf[1] = 'X';
// buf is now "aXst\0"
// modifying the original String does not invalidate the buffer
str = "Je suis une chaine!";
// buf is still "aXst\0"
這允許您部分復制字符串,或在稍后的索引處復制,或任何您想要的。 最重要的是,您復制到的這個數組是可變的。 我們可以改變它,因為它是一個副本,它不會影響我們從中復制它的原始String
。 這種靈活性是有代價的。 首先,我們要有一個足夠大的緩沖區,這個緩沖區在編譯時可能不知道,並且占用內存。 其次,復制需要時間。
但是如果我們正在調用一個只想讀取 c 樣式字符串作為輸入的函數呢? 完全不需要修改嗎?
這就是c_str()
用武之地。 String
對象有一個底層的 c-string 類型數組(是的,空終止符等等)。 c_str()
簡單地返回一個const char*
到這個數組。 我們將其const
以免意外更改。 對象的基礎數據不應被其控制之外的隨機函數更改。
這是c_str()
的完整代碼:
const char* c_str() const { return buffer; }
您已經知道如何使用它,但為了說明不同之處:
String str = "I am another string!";
const char* c = str.c_str();
// c[1] = 'X'; // error, cannot modify a const object
// modifying the original string may reallocate the underlying buffer
str = "Je suis une autre chaine!";
// dereferencing c now may point to invalid memory
由於c_str()
僅返回底層數據指針,因此速度很快。 但是我們不希望其他函數被允許修改這些數據,所以它是const
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.