converting char array to string type

本文探讨了C++中处理含有嵌入空字符的C风格字符串到std::string的方法。通过逐字符复制和使用assign方法,避免了因遇到空字符而导致字符串截断的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

std::string str;
char array[] = "Hello World";
for(int i = 0; array[i] != 0; i++)
   str 
+= array[i];
//-----------------------------------
std::string str;
char array[] = "Hello World";

str 
= array;
Use of NULL is discouraged in C++ because it can be redefined to be anything one wants -- c++ standards do not dictate what NULL should be.

The '\0' and 0 are one in the same thing. The compiler will translate '\0' to 0 during compilation.

All C-style strings are said to be NULL-terminated -- that definition is carry-over from C language. It really means that the end of the string is indicated by the byte which contains a 0.

you cannot assign C-strings that have enbedded 0s to std::string as I posted earlier. As you found out the assignment stops at the first 0. You could do it one character at a time, but then std::string is no longer an ascii string but a binary string, and most of the std::string methods cannot be used, again because of embedded 0s.

In this example, the output of the first cout is jest "Hello" because of the embedded 0.
#include <string>
#include 
<iostream>
using namespace std;

int main()
{
    
int i;
    
char str[] = "Hello \0World";
    
string s = str;
    cout 
<< s << endl; << output = "Hello"
    
int sz = sizeof(str);
    s 
= "";
    
for(i = 0; i < sz; i++)
        s 
+= str[i];

    cout 
<< s << endl;
 
// now assign characters one at a time
    sz = s.length();
    
for(i = 0; i < sz; i++)
        cout 
<< s[i];
    cout 
<< endl; output = "Hello World" 
    
return 0;

} 

int main()
{
    
int i;
    
string s;
    
char str[] = "Hello \0World";
    
int sz = sizeof(str);
    s.assign(str,sz);
    sz 
= s.length();
    
for(i = 0; i < sz; i++)
        cout 
<< s[i];
    cout 
<< endl;
    
return 0;

} 

转载于:https://www.cnblogs.com/smartvessel/archive/2011/05/12/2044040.html

In file included from c:\Users\Administrator\Documents\Arduino\libraries\Blinker\src/BlinkerESPMQTT.h:16, from c:\Users\Administrator\Documents\Arduino\libraries\Blinker\src/Blinker.h:43, from E:\sketch_aug20a\sketch_aug20a.ino:6: c:\Users\Administrator\Documents\Arduino\libraries\Blinker\src/Adapters/BlinkerMQTT.h: In member function 'virtual char* BlinkerMQTT::token()': c:\Users\Administrator\Documents\Arduino\libraries\Blinker\src/Adapters/BlinkerMQTT.h:144:50: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] 144 | char * token() { if (!isMQTTinit) return ""; else return MQTT_KEY_MQTT; } | ^~ In file included from c:\Users\Administrator\Documents\Arduino\libraries\Blinker\src/BlinkerESPMQTT.h:16, from c:\Users\Administrator\Documents\Arduino\libraries\Blinker\src/Blinker.h:43, from E:\sketch_aug20a\sketch_aug20a.ino:6: c:\Users\Administrator\Documents\Arduino\libraries\Blinker\src/Adapters/BlinkerMQTT.h: In member function 'virtual char* BlinkerMQTT::lastRead()': c:\Users\Administrator\Documents\Arduino\libraries\Blinker\src/Adapters/BlinkerMQTT.h:963:17: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] 963 | else return ""; | ^~ In file included from c:\Users\Administrator\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerApi.h:95, from c:\Users\Administrator\Documents\Arduino\libraries\Blinker\src/BlinkerESPMQTT.h:17, from c:\Users\Administrator\Documents\Arduino\libraries\Blinker\src/Blinker.h:43, from E:\sketch_aug20a\sketch_aug20a.ino:6: c:\Users\Administrator\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerApiBase.h: In member function 'char* BlinkerBridge_key::getName()': c:\Users\Administrator\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerApiBase.h:196:29: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] 196 | else return "false"; | ^~~~~~~ In file included from c:\Users\Administrator\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerApi.h:96, from c:\Users\Administrator\Documents\Arduino\libraries\Blinker\src/BlinkerESPMQTT.h:17, from c:\Users\Administrator\Documents\Arduino\libraries\Blinker\src/Blinker.h:43, from E:\sketch_aug20a\sketch_aug20a.ino:6: c:\Users\Administrator\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerProtocol.h: In member function 'char* BlinkerProtocol::deviceName()': c:\Users\Administrator\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerProtocol.h:104:86: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] 104 | char * deviceName() { if (isInit) return conn->deviceName(); else return ""; } | ^~ c:\Users\Administrator\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerProtocol.h: In member function 'char* BlinkerProtocol::authKey()': c:\Users\Administrator\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerProtocol.h:105:83: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] 105 | char * authKey() { if (isInit) return conn->authKey(); else return ""; } | ^~ c:\Users\Administrator\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerProtocol.h: In member function 'char* BlinkerProtocol::token()': c:\Users\Administrator\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerProtocol.h:106:79: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] 106 | char * token() { if (isInit) return conn->token(); else return ""; } | ^~ c:\Users\Administrator\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerProtocol.h: In member function 'char* BlinkerProtocol::dataParse()': c:\Users\Administrator\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerProtocol.h:257:86: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] 257 | char* dataParse() { if (canParse) return conn->lastRead(); else return ""; } | ^~ In file included from c:\Users\Administrator\Documents\Arduino\libraries\Blinker\src/Adapters/BlinkerMQTT.h:46, from c:\Users\Administrator\Documents\Arduino\libraries\Blinker\src/BlinkerESPMQTT.h:16, from c:\Users\Administrator\Documents\Arduino\libraries\Blinker\src/Blinker.h:43, from E:\sketch_aug20a\sketch_aug20a.ino:6: c:\Users\Administrator\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerApi.h: At global scope: c:\users\administrator\documents\arduino\libraries\blinker\src\blinker\blinkerconfig.h:226:41: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] 226 | #define BLINKER_CMD_BUILTIN_SWITCH "switch" | ^~~~~~~~ c:\Users\Administrator\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerApi.h:913:71: note: in expansion of macro 'BLINKER_CMD_BUILTIN_SWITCH' 913 | BlinkerWidgets_string _BUILTIN_SWITCH = BlinkerWidgets_string(BLINKER_CMD_BUILTIN_SWITCH); | ^~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from c:\Users\Administrator\Documents\Arduino\libraries\Blinker\src/BlinkerESPMQTT.h:17, from c:\Users\Administrator\Documents\Arduino\libraries\Blinker\src/Blinker.h:43, from E:\sketch_aug20a\sketch_aug20a.ino:6: c:\Users\Administrator\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerApi.h: In member function 'char* BlinkerApi::bridgeKey(uint8_t)': c:\Users\Administrator\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerApi.h:7831:21: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] 7831 | else return ""; | ^~ c:\Users\Administrator\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerApi.h: In member function 'char* BlinkerApi::bridgeName(uint8_t)': c:\Users\Administrator\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerApi.h:7838:21: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] 7838 | else return "false"; | ^~~~~~~ c:\Users\Administrator\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerApi.h: In member function 'char* BlinkerApi::widgetName_str(uint8_t)': c:\Users\Administrator\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerApi.h:8467:17: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] 8467 | else return ""; | ^~ c:\Users\Administrator\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerApi.h: In member function 'char* BlinkerApi::widgetName_joy(uint8_t)': c:\Users\Administrator\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerApi.h:8474:21: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] 8474 | else return ""; | ^~ c:\Users\Administrator\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerApi.h: In member function 'char* BlinkerApi::widgetName_rgb(uint8_t)': c:\Users\Administrator\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerApi.h:8481:17: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] 8481 | else return ""; | ^~ c:\Users\Administrator\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerApi.h: In member function 'char* BlinkerApi::widgetName_int(uint8_t)': c:\Users\Administrator\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerApi.h:8487:17: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] 8487 | else return ""; | ^~ c:\Users\Administrator\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerApi.h: In member function 'char* BlinkerApi::widgetName_tab(uint8_t)': c:\Users\Administrator\Documents\Arduino\libraries\Blinker\src/Blinker/BlinkerApi.h:8493:17: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] 8493 | else return ""; | ^~ E:\sketch_aug20a\sketch_aug20a.ino: In function 'bool loadCredentials(const char*, const char*, const char*)': E:\sketch_aug20a\sketch_aug20a.ino:117:10: error: cannot convert 'String' to 'const char*' in assignment 117 | ssid = String(ssidBuf); | ^~~~~~~~~~~~~~~ | | | String E:\sketch_aug20a\sketch_aug20a.ino:125:10: error: cannot convert 'String' to 'const char*' in assignment 125 | pass = String(passBuf); | ^~~~~~~~~~~~~~~ | | | String E:\sketch_aug20a\sketch_aug20a.ino:133:15: error: cannot convert 'String' to 'const char*' in assignment 133 | deviceKey = String(keyBuf); | ^~~~~~~~~~~~~~ | | | String E:\sketch_aug20a\sketch_aug20a.ino: In function 'bool connectWiFi()': E:\sketch_aug20a\sketch_aug20a.ino:292:24: error: cannot convert 'String' to 'const char*' 292 | if (!loadCredentials(ssid, password, deviceKey)) { | ^~~~ | | | String E:\sketch_aug20a\sketch_aug20a.ino:102:34: note: initializing argument 1 of 'bool loadCredentials(const char*, const char*, const char*)' 102 | bool loadCredentials(const char* ssid, const char* pass, const char* deviceKey) { | ~~~~~~~~~~~~^~~~ E:\sketch_aug20a\sketch_aug20a.ino: In function 'void setup()': E:\sketch_aug20a\sketch_aug20a.ino:391:29: error: cannot convert 'String' to 'const char*' 391 | loadCredentials("", "", deviceKey); // 获取设备密钥 | ^~~~~~~~~ | | | String E:\sketch_aug20a\sketch_aug20a.ino:102:70: note: initializing argument 3 of 'bool loadCredentials(const char*, const char*, const char*)' 102 | bool loadCredentials(const char* ssid, const char* pass, const char* deviceKey) { | ~~~~~~~~~~~~^~~~~~~~~ E:\sketch_aug20a\sketch_aug20a.ino:392:38: error: 'ssid' was not declared in this scope 392 | Blinker.begin(deviceKey.c_str(), ssid.c_str(), password.c_str());// 连接Blinker平台 | ^~~~ E:\sketch_aug20a\sketch_aug20a.ino:392:52: error: 'password' was not declared in this scope 392 | Blinker.begin(deviceKey.c_str(), ssid.c_str(), password.c_str());// 连接Blinker平台 | ^~~~~~~~ E:\sketch_aug20a\sketch_aug20a.ino:393:13: error: 'class BlinkerESPMQTT' has no member named 'attachVoice'; did you mean 'attachBridge'? 393 | Blinker.attachVoice(voiceCommand); | ^~~~~~~~~~~ | attachBridge Multiple libraries were found for "EEPROM.h" Used: C:\Users\Administrator\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.1.2\libraries\EEPROM Not used: C:\Users\Administrator\Documents\Arduino\libraries\ATMAC_EEPROM Multiple libraries were found for "Ticker.h" Used: C:\Users\Administrator\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.1.2\libraries\Ticker Not used: C:\Users\Administrator\Documents\Arduino\libraries\Ticker Not used: C:\Users\Administrator\Documents\Arduino\libraries\SimpleTicker Multiple libraries were found for "Blinker.h" Used: C:\Users\Administrator\Documents\Arduino\libraries\Blinker Not used: C:\Users\Administrator\Documents\Arduino\libraries\GyverBlinker Not used: C:\Users\Administrator\Documents\Arduino\libraries\BarePoller Multiple libraries were found for "ArduinoOTA.h" Used: C:\Users\Administrator\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.1.2\libraries\ArduinoOTA Not used: C:\Users\Administrator\Documents\Arduino\libraries\ArduinoOTA exit status 1 Compilation error: cannot convert 'String' to 'const char*' in assignment
08-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值