Je suis désolé de dire que C++ est un peu intuitif ici.Vous pouvez dire:
char name[10] = "abcd";
et, compte tenu de votre définition ci-dessus:
buffer buf = { "NDS", "3174" };
Ce dernier repose sur une à une correspondance entre les champs dans la structure et les valeurs de la liste, donc je J'ai dû inverser l'ordre utilisé dans vos missions.
Mais, vous ne pouvez pas faire votre
buf.ProjectName = "abcde";
Qu'est-ce que les demandes ont effectivement en C++ est que buf.ProjectName être chargé avec un pointeur vers la mémoire contenant les données de caractères « ABCDE ». Vous ne pouvez pas faire cela, car ProjectName lui-même est un autre tampon pour les données de caractères, et pas de pointeur vers les données de caractères.
Donc, quand vous avez une source et la zone de destination contenant des chaînes terminées par NUL (Google ASCIIZ si nécessaire), vous devez utiliser une fonction de support pour copier l'un à l'autre:
strcpy(buf.ProjectName, "name");
Si ProjectName de dimension est trop petite, alors votre chaîne peut écraser la mémoire que le compilateur n'a pas réservée à ProjectName, provoquant probablement un crash ou une sortie erronée. Vous pouvez protéger contre cela - si les tailles relatives des chaînes ne sont pas manifestement correctes - en utilisant strncpy(buf.ProjectName, "name", sizeof buf.ProjectName)
. Malheureusement, cela signifie que buf.ProjectName
peut ne pas contenir toute la valeur attendue, ce qui rend l'utilisation douteuse.
C++ améliore cette façon de gérer les données textuelles - héritées de C - avec la classe std :: string. Vous pouvez simplement faire ceci:
#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
Utilisez std :: String plutôt que des tableaux char. –