C++ AVR 附加到 const char *
Posted
技术标签:
【中文标题】C++ AVR 附加到 const char *【英文标题】:C++ AVR append to const char * 【发布时间】:2014-05-23 18:07:36 【问题描述】:在 C# 中,您将有一个字符串,要附加到该字符串,我将执行以下操作:
//C#
string str="";
str += "Hello";
str += " world!"
//So str is now 'Hello world!'
但在 AVR 的 C++ 中,我使用 const char *
。我怎么能附加到它?
const char * str="";
str += "Hello world!"; //This doesn't work, I get some weird data.
str = str + "Hello world!"; //This doesn't work either
注意:我正在使用 Atmel Studio 6 编写 avr,因此我认为大多数人在 C++ 中使用的功能无法使用,因为我在尝试一些我在网上看到的示例后立即构建失败。我也没有String
数据类型。
【问题讨论】:
您没有可用的std::string
? (#include <string>
)
不,我有一个string.h
,允许我使用strlen()
等,但没有字符串类型。但是如果我能学会的话,附加到const char *
是可以的。
你必须自己构建,或者使用普通的 C“字符串”处理函数(strcat 等),并自己管理内存。网络上大约有 15.3 万亿个 C 中的字符串连接示例,应该很容易找到。
:(有没有简单的方法可以追加到const char *
?
如果简单的意思是“使用 += 而不使用 std::string
”,那么没有。
【参考方案1】:
您真的应该深入研究一些 C 教程或书籍并阅读有关字符串的章节。
const char * str="";
在(常量)数据段中创建一个指向空字符串的指针。
str += "Hello world!"
:
-
字符串处理在 C 中不能这样工作
指针指向的内存是常量,你应该不能修改它
向指针添加内容将更改指针指向的位置(而不是数据)
由于您使用的是 AVR,因此您应该避免使用动态内存。 定义一个空字符串常量没有意义。
小例子:
#define MAX_LEN 100
char someBuf[MAX_LEN] = ""; // create buffer of length 100 preinitilized with empty string
const char c_helloWorld[] = "Hello world!"; // defining string constant
strcat(someBuf, c_helloWorld); // this adds content of c_helloWorld at the end of somebuf
strcat(someBuf, c_helloWorld); // this adds content of c_helloWorld at the end of somebuf
// someBuf now contains "Hello world!Hello world!"
附加费用/说明: 由于 avr 具有哈佛架构,因此它不能(至少在没有情况下)读取程序存储器。因此,如果您使用字符串文字(如“Hello world!”),默认情况下它们需要双倍空间。其中一个实例位于闪存中,在启动代码中它们将被复制到 SRAM。根据您的 AVR,这可能很重要!你可以解决这个问题,只通过使用 PROGMEM 属性(或类似的东西)声明指针将它们存储在程序内存中,但现在你需要自己在运行时从闪存中显式读取它们。
【讨论】:
【参考方案2】:据我所知,C# 中的字符串是不可变的,所以行
str += " world!"
实际上创建了一个 new 字符串,其值为原始字符串的值,并附加了" world"
,然后使str
引用该新字符串。不再有对旧字符串的任何引用,因此它最终会被垃圾回收。
但是 C 风格的字符串是可变的,除非你明确地复制它们,否则它们会被原地修改。所以事实上如果你有一个const char*
,你根本不能修改字符串,因为const T*
意味着指针指向的T
数据不能被修改。相反,您必须创建一个新字符串,
// In C, omit the static_cast<char*>; this is only necessary in C++.
char* new_str = static_cast<char*>(malloc(strlen(str)
+ strlen("Hello world!")
+ 1));
strcpy(new_str, str);
strcat(new_str, "Hello world!");
str = new_str;
// remember to free(str) at some point!
这很麻烦而且表达力也不是很强,所以如果您使用 C++,显而易见的解决方案是改用 std::string
。与 C# 字符串不同,C++ 字符串具有值语义并且不是不可变的,但与 C 字符串不同,它可以以直接的方式附加:
std::string str = "";
str += "Hello world!";
同样,如果您标记原始字符串 const
,您将无法在不创建新字符串的情况下追加到它。
【讨论】:
以上是关于C++ AVR 附加到 const char *的主要内容,如果未能解决你的问题,请参考以下文章
为啥从 int 到 const char* 的转换会破坏 C++ [重复]
C++标准库 如何连接两个const char *类型字符串,并返回const char * 类型结果?