当前位置:  开发笔记 > 编程语言 > 正文

添加到c*无效转换从const char*到char*"

如何解决《添加到c*无效转换从constchar*到char*"》经验,为你挑选了2个好方法。

我在一个名为WiServer.hArduino 的文件中有以下功能.

GETrequest(uint8* ipAddr, int port, char* hostName, char* URL);

现在的问题是我需要将一个int值(setting1)连接到char*URL参数,例如下面的内容.

"twittermood.php?status=sendTweet&setting1="+setting1

我收到一个错误:

从const char*到char*的无效转换

我如何解决它?



1> Ben Jackson..:

您已经获得了不错的通用C++建议,但对于8位AVR微控制器上Arduino的特殊情况,我认为您需要特定于平台的建议:

Arduino运行时提供String对象.这些例子可能涵盖了您的问题.

由于Arduino上的RAM空间非常有限,因此通常使用特殊属性将常量字符串放入闪存(本质上是ROM)中,这需要不同的指令来访问.使用GCC构建的AVR代码通常构建在AVR Libc之上,它支持对常量字符串和RAM字符串的混合操作.您必须明确代码并选择正确的操作.这至少需要基本了解C字符串的工作方式以及指针的工作方式.我不确定Arduino字符串会自动提供多少这种聪明才智,但如果没有这种聪明,所有字符串常量最终都会在启动时复制到RAM中,并且会一直占用这些宝贵的字节.

如果RAM空间成为问题,或者您正在使用广泛的字符串操作的AVR应用程序,您需要学习如何使用PGM Space操作的混合(可以在flash中使用只读字符串的字符串函数)和常规C-样式基于RAM的字符串操作.



2> sbi..:

使用std::string,而不是C字符串.使用字符串流,而不是尝试将非字符串值连接到字符串:

std::ostringstream oss;
oss << "twittermood.php?status=sendTweet&setting1=" << setting1;
use(oss.str()); // or use(oss.str().c_str());

如果该API确实需要非const字符串(假设它甚至不需要字符串的长度,我认为它只是一个错误的API const),将字符串复制到缓冲区并传递:

const std::string& str = oss.str(); 
std::vector 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- 为了您自己的利益.

推荐阅读
ERIK又
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有