将整数转换为字符串/字符 C++/Arduino

3

这可能是C ++中最容易做的事情。

..我知道这个问题已经被问了很多次,但请记住,这是Arduino项目的一部分,内存节省是一个重要问题,因为我只有32256字节的最大空间可用。

我需要将一个整数转换为字符串。

int GSM_BAUD_RATE;
GSM_BAUD_RATE = 4800;

Serial.println("GSM Shield running at " + GSM_BAUD_RATE + " baud rate.");

显然,最后一行会给我一个错误提示。
提前感谢您。

8
你一定是从Java的背景出发的。 - user406009
1
为Arduino添加标签 - 这在这里会有很大的区别。 - Matteo Italia
2
@Fulvio:事实上,你正在使用Arduino开发板是一个非常重要的信息,你应该在一开始的问题中加以说明。作为今后在Stack Overflow上提问的参考,你需要指明你正在使用哪个平台。C++被用于许多不同的平台;如果你没有说清楚,我们将默认使用标准的C++功能。 - In silico
1
@Insilico 已经注意到了,以备将来参考。 - fulvio
6个回答

6

如果您正在进行Arduino项目开发,您可以直接使用Serial对象来处理它:

int GSM_BAUD_RATE;
GSM_BAUD_RATE = 4800;

Serial.print("GSM Shield running at ");
Serial.print(GSM_BAUD_RATE);
Serial.println(" baud rate.");

自从printprintln方法有重载以处理多种不同类型的情况后,它们变得非常有用。
其他方法在“普通”计算机上可能很有用,但像stringostringstream这样的东西需要堆分配,在Arduino板上应尽可能避免使用,因为存在严格的内存限制。

你赢了,Matteo,感谢你注意到这是一个Arduino项目。 - fulvio

3

更新:此回答回答的是在提到Arduino之前的原始问题。我将保留它,因为对于非嵌入式系统来说这是正确的答案。

您可以使用stringstream创建一个格式化字符串,并从中提取一个string

#include <sstream>

std::ostringstream s;
s << "GSM Shield running at " << GSM_BAUD_RATE << " baud rate.";

Serial.println(s.str().c_str()); // assuming `println(char const *);`

如果我猜得没错的话,那段代码是为Arduino项目编写的 - 而<sstream>在那里不可用(即使可用,也需要堆分配,并且使用总共2KB的RAM并不是一个好主意)。 - Matteo Italia
在这种情况下,你会想要其他答案之一。如果你有完整的标准库并且可以承受一点内存分配,这是更安全的选择。 - Mike Seymour
@MikeSeymour 感谢您的回答,不过我应该提到这最初是为Arduino项目而设计的。 - fulvio

1
 int i = 42;
 char buf[30];
 memset (buf, 0, sizeof(buf));
 snprintf(buf, sizeof(buf)-1, "%d", i);
 // now buf contains the "42" string.

1
你可以使用stringstream:
int main()  
{
    int myInt = 12345;
    std::ostringstream ostr;
    ostr << myInt;
    std::string myStr = "The int was: " + ostr.str();
    std::cout << myStr << std::endl;
}

0

用C++实现这个的方法是使用boost::format

std::string str = "GSM blah blah ";
str+= boost::str(boost::format("%d") % 4800);
str+= "blah blah";

我非常确定他不想在Arduino板上使用boost。 - Matteo Italia
它需要一个工作的标准库,据我所知,在Arduino项目中并不完全可用。此外,std::string需要堆分配,在那里不是一个好主意。 - Matteo Italia
顺便问一下,“header only” 从什么时候开始意味着“运行时成本低”? - Matteo Italia
哎呀,注释应该是“这是一个头文件,所以不需要链接到外部库”。 - user406009

0

试试这个:

#include <iostream>

int GSM_BAUD_RATE; 
GSM_BAUD_RATE = 4800; 
char text[256];

sprintf(text, "GSM Shield running at %d baud rate.", GSM_BAUD_RATE);

Serial.println(text);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接