在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
数据类型。
答案 0 :(得分:3)
你真的应该深入研究一些C教程或预订并阅读关于字符串的章节。
const char * str="";
创建一个指向(常量)数据段中空字符串的指针。
str += "Hello world!"
:
因为你在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
,则无法在不创建新字符串的情况下附加到该字符串。