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* 数组

C++标准库 如何连接两个const char *类型字符串,并返回const char * 类型结果?

如何在 C++ 中将 char 指针附加到 std::string

c++关于const char*的问题

const char* 与 char* (C++)