簡體   English   中英

使用 c_str() 或 toCharArray() 將字符串轉換為常量字符?

[英]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。

如果您需要以任何方式修改返回的 c 樣式字符串,或者在修改原始String后保留它,您應該使用toCharArray

如果您只需要一個以空字符結尾的 c 樣式字符串作為只讀參數傳遞給函數,請使用c_str


String.toCharArray() Arduino 參考

String.c_str() 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM