[英]Adding to c* invalid conversion from const char* to char*"
我在一个名为Arduino的WiServer.h
的文件中具有以下功能。
GETrequest(uint8* ipAddr, int port, char* hostName, char* URL);
现在的问题是,我需要将一个int值(setting1)连接到char*
URL参数,例如下面的示例。
"twittermood.php?status=sendTweet&setting1="+setting1
我收到一个错误:
从const char *到char *的无效转换
我如何解决它?
您已经获得了不错的通用C ++建议,但是对于8位AVR微控制器上Arduino的特殊情况,我认为您需要特定于平台的建议:
Arduino运行时提供一个String对象。 这些示例可能涵盖了您的问题。
由于Arduino上的RAM空间非常有限,通常使用特殊属性将常量字符串放入闪存(本质上是ROM)中,这需要访问不同的指令。 使用GCC构建的AVR代码通常建立在AVR Libc之上,该库支持对常量字符串和RAM字符串进行混合操作。 您必须在代码中明确显示并选择正确的操作。 这至少需要对C字符串如何工作以及指针如何工作有基本的了解。 我不确定Arduino字符串会自动提供多少这种技巧,但是如果没有这种技巧,您的所有字符串常量最终都会在启动时复制到RAM中,并始终占用这些宝贵的字节。
如果RAM空间出现问题,或者您正在使用AVR应用程序进行大量的字符串操作,则需要学习如何结合使用PGM Space操作 (可以在Flash中的只读字符串上使用的字符串函数)和常规C-样式基于RAM的字符串操作 。
使用std::string
,而不是C字符串。 使用字符串流 ,而不是尝试将非字符串值连接到字符串:
std::ostringstream oss;
oss << "twittermood.php?status=sendTweet&setting1=" << setting1;
use(oss.str()); // or use(oss.str().c_str());
如果该API确实需要一个非const
字符串(假设它甚至不占用字符串的长度,那么我想这只是一个无视const
的错误API),请将字符串复制到缓冲区中并传递该字符串:
const std::string& str = oss.str();
std::vector<char> buffer(str.begin(), str.end());
buffer.push_back('\0');
GETrequest(addr, port, &buffer[0], c);
至于当你做的时候真正发生的事情:
"twittermood.php?status=sendTweet&setting1="
是char[43]
类型的右值 ,它隐式转换为 const char*
( 指向第一个字符的指针) 。 为此,您添加一个整数,从而形成一个const char*
类型的新指针,该指针指向或多或少的随机存储位置 。 我想您尝试将其作为char*
传递给您的API函数,为此必须删除const
。
但是,C ++编译器永远不会隐式删除const
(为了自己的利益)。
使用std :: string而不是char *进行此类工作。 C语言中的char *非常基础,如果您不熟悉C语言的工作原理,那么很容易出错。
如果需要使用char *,请查看strcpy,strcat和snprintf。 但是这些功能在新手手中非常危险,并且可能导致内存损坏和崩溃。
您可以为此使用ostringstream
:
#include <sstream>
// ...
std::ostringstream os;
os << "twittermood.php?status=sendTweet&setting1=" << setting1;
GETrequest(addr, port, hostname, os.str().c_str());
使用std::string
代替char*
,也可以使用std::stringstream
进行补充。 但是首先关于您的错误:
您的问题是"twittermood.php?status=sendTweet&setting1="
将为您提供一个const char*
,它不能隐式转换为char*
。 如果您确实确定GETrequest
不会尝试更改其URL
参数的值,则可以在const char*
变量上使用const_cast<char*>(...)
放弃const char*
。 但是,只有在绝对确定不会更改它的情况下,才执行此操作(不要对编译器说谎(关于常量性(或其他任何东西)))。
即使您执行了该操作, "twittermood.php?status=sendTweet&setting1="+setting1
也不会执行您认为的操作。 就像我说的那样,您的字符串常量将为您提供const char*
,该字符串对字符串操作没有任何了解。 因此,向其添加一个int
不会将该int
与字符串连接,而是执行一些指针算术运算,因此,如果您很幸运并且您的int
足够小,那么您将仅获得URL的一部分,否则您将处理完全不同的内容。
发布C解决方案以确保完整性:
const char ctext[] = "twittermood.php?status=sendTweet&setting1=";
char text[sizeof(ctext) + 20];
snprintf(text, sizeof(text), "%s%i", ctext, setting1);
std字符串和流使用起来更好/更安全。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.