Мне жаль говорить, что C ++ здесь немного не интуитивен. Вы можете сказать:
char name[10] = "abcd";
и, учитывая ваше определение выше:
buffer buf = { "NDS", "3174" };
Последнее основано на взаимно-однозначном соответствии между полями в структуре и значениями в списке, поэтому мне пришлось изменить порядок, использованный в ваших назначениях.
Но вы не можете сделать свое
buf.ProjectName = "abcde";
Что на самом деле запрашивает в C ++, так это то, что buf.ProjectName загружается с указателем на память, содержащую символьные данные «abcde». Вы не можете этого сделать, поскольку само ProjectName является еще одним буфером для символьных данных, а не для указателя на символьные данные.
Таким образом, если у вас есть область источника и назначения, содержащая строки, оканчивающиеся NUL (Google ASCIIZ, если необходимо), вам необходимо использовать функцию поддержки для копирования из одной в другую:
strcpy(buf.ProjectName, "name");
Если размер ProjectName слишком мал, ваша строка может перезаписать память, которую компилятор не зарезервировал для ProjectName, что может вызвать сбой или ошибочный вывод. Вы можете защититься от этого - если относительные размеры строк явно не в порядке - используйте strncpy(buf.ProjectName, "name", sizeof buf.ProjectName)
. К сожалению, это означает, что buf.ProjectName
может не содержать ожидаемое значение в полном объеме, что делает его сомнительным.
C ++ улучшает этот способ обработки текстовых данных, которые наследуются от C, с помощью класса std :: string. Вы можете просто сделать это:
#include <string>
struct Buffer
{
std::string project_name_;
std::string project_id_;
};
Buffer b;
b.project_name_ = "abcde"; // works with string literals.
b.project_id_ = b.project_name_; // can copy from std::string to std::string