首页 > 解决方案 > 使用字符串方法 .c_str() 将 Arduino C++ 字符串转换为 ANSI C 字符串(char* 数组)

问题描述

因为关于这个问题的许多帖子都具有误导性或模棱两可,这就是它的工作原理,仅供记录(已测试):How to convert an Arduino C++ String to an ANSI C string (char* array) using the String method .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:该示例适用于可变字符串和非常量的可变字符数组,可以重复和任意分配(也可以选择用于常量字符串)。

标签: stringarduino

解决方案


我知道您的意图是尝试分享使用的“最佳实践” String.c_str(),但我不禁要说,您的“答案”正是您所说的导致混淆、误导或模棱两可的答案。如果有人发现String.c_str()用法具有误导性或模棱两可,那是因为人们可能没有阅读 Arduino Reference 上的c_str(),或者完全理解指针。

将 String 的内容转换为 C 样式、以 null 结尾的字符串。请注意,这可以直接访问内部字符串缓冲区,应谨慎使用。特别是,您永远不应该通过返回的指针修改字符串。当您修改 String 对象时,或者当它被销毁时,之前由 c_str() 返回的任何指针都将变为无效并且不应再使用。

String.c_str()返回一个指向char数组的指针(即一个char以 a 结尾的数组'\0'),换句话说,它const char* ptr = String.c_str()准确地表示了String.c_str()它的含义。请注意,它是直接访问 String 对象中的缓冲区,您不应该更改它。所以在大多数情况下,你使用它就像Serial.print(ptr). strcpy如果您想修改“副本”的内容,您只需要获取它的副本(如您的 中所示)。

简单来说,如果 char 数组(即String.c_str())是你想从String由森林、猴子和整个九码组成的丛林(即物体)中得到的香蕉,那么你直接指向香蕉,什么都String.c_str() 没有更多,不少于。


推荐阅读