我在一个名为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 *的无效转换

我如何解决它?

===============>>#1 票数:9 已采纳

您已经获得了不错的通用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 票数:6

使用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 (为了自己的利益)。

===============>>#3 票数:2

使用std :: string而不是char *进行此类工作。 C语言中的char *非常基础,如果您不熟悉C语言的工作原理,那么很容易出错。

如果需要使用char *,请查看strcpy,strcat和snprintf。 但是这些功能在新手手中非常危险,并且可能导致内存损坏和崩溃。

===============>>#4 票数:1

您可以为此使用ostringstream

#include <sstream>

// ...

std::ostringstream os;
os << "twittermood.php?status=sendTweet&setting1=" << setting1;

GETrequest(addr, port, hostname, os.str().c_str());

===============>>#5 票数:1

使用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的一部分,否则您将处理完全不同的内容。

===============>>#6 票数:0

发布C解决方案以确保完整性:

const char ctext[] = "twittermood.php?status=sendTweet&setting1=";
char text[sizeof(ctext) + 20];
snprintf(text, sizeof(text), "%s%i", ctext, setting1);

std字符串和流使用起来更好/更安全。

  ask by unleashed translate from so

未解决问题?本站智能推荐: