C ++ AVR附加到const char *

时间:2014-05-23 18:07:36

标签: c# c++ string avr atmel

在C#中你有一个字符串,要附加到字符串我将执行以下操作:

//C#
string str="";
str += "Hello";
str += " world!"
//So str is now 'Hello world!'

但是在C ++ for AVR中,我使用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数据类型。

2 个答案:

答案 0 :(得分:3)

你真的应该深入研究一些C教程或预订并阅读关于字符串的章节。

const char * str="";创建一个指向(常量)数据段中空字符串的指针。

str += "Hello world!"

  1. 字符串处理在C
  2. 中不能像这样工作
  3. 指针指向的内存是常量,你不应该修改它
  4. 向指针添加内容将改变指针指向的位置(而不是数据)
  5. 因为你在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属性(或类似的东西)声明Pointer来解决这个问题并将它们存储在程序存储器中,但现在你需要在运行时自己明确地从flash中读取它们。

答案 1 :(得分:0)

据我所知,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,则无法在不创建新字符串的情况下附加到该字符串。