使用字符串方法.c_str()将Arduino c++字符串转换为ANSI C字符串(char*数组)



因为很多关于这个问题的帖子是误导或模棱两可的,这是它是如何工作的,只是为了记录(测试):如何使用String方法将Arduino c++字符串转换为ANSI C字符串(char*数组)。c_str()

String myString = "WLAN_123456789";  // Arduino String
char cbuffer[128]="";    // ANSI C string (char* array); adjust size appropriately
strcpy( cbuffer, myString.c_str() );

例子(测试):

void setup() {
   Serial.begin(115200);
   delay(1000);
   Serial.println();   
   String myString = "WLAN_123456789"; 
   char cbuffer[128]="";
   Serial.println(myString);  // debug
   strcpy( cbuffer, myString.c_str() );
   Serial.println(cbuffer);  // debug
}
void loop() {
}

PS:这个例子是针对可变字符串和可变字符数组的,它们不是常量,可以被重复和任意地赋值(也可用于常量字符串)。

我知道你的意图是想分享"最佳实践";使用String.c_str(),但我忍不住说,你的"答案";恰恰是你所说的引起混淆、误导或模棱两可的话。如果有人发现String.c_str()的使用是误导或模棱两可的,这是因为一个人可能没有阅读Arduino参考中的c_str(),或者完全理解指针。

将String的内容转换为c风格的以空结尾的字符串。注意,这样可以直接访问内部String缓冲区,使用时要小心。特别是,永远不应该通过返回的指针修改字符串。当你修改String对象,或者当它被销毁时,以前由c_str()返回的任何指针都将失效,不应该再使用。

String.c_str()返回指向char数组的指针(即以''结尾的char数组),换句话说,const char* ptr = String.c_str()正是String.c_str()的意思。请注意,它直接访问String对象中的缓冲区,您不应该更改它。所以在大多数情况下,你像使用Serial.print(ptr)一样使用它。如果你想修改你的"副本"的内容,你只需要得到它的副本(如你的strcpy所示)。

简单地说,如果字符数组(即String.c_str())是你想从丛林(即String对象)中获得的香蕉,丛林由森林,猴子和整个九码组成,String.c_str()指向你直接指向香蕉,不多也不多。

最新更新