C # — C ++ AVR добавить к const char *

В C # у вас будет строка, для добавления к ней я сделаю следующее:

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

Но в C ++ для 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

Решение

Вы действительно должны изучить какой-нибудь учебник или книгу по Си и прочитать главу о строках.

const char * str=""; создает указатель на пустую строку в (постоянном) сегменте данных.

str += "Hello world!":

  1. Обработка строки не работает, как это в C
  2. память, на которую указывает указатель, постоянна, ее нельзя изменять
  3. добавление чего-либо к указателю изменит местоположение, на которое указывает указатель (а не данные)

Поскольку вы находитесь на 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 это может иметь значение! Вы можете обойти это и сохранить их только в памяти программы, объявив Pointer с помощью атрибута PROGMEM (или чего-то подобного), но теперь вам нужно явно прочитать их из flash во время выполнения самостоятельно.

3

Другие решения

Из того, что я знаю, строки в C # неизменны, поэтому строка

str += " world!"

на самом деле создает новый строка, значение которой равно исходной строке, с " 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, вы не сможете добавить к нему без создания новой строки.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector