5

私はこの構造を持っています:

typedef struct SM_DB
{
    LIST_TYPE           link;
    char                name[SM_NAME_SIZE];
} SM_DB_TYPE;

そして、その「名前」に文字列を割り当てたいと思います。私はこのようにやっています:

SM_DB_TYPE one;
one.name = "Alpha";

ただし、コンパイル後、「エラー C2106: '=' : 左オペランドは左辺値でなければなりません」というエラーが表示されます。これがかなり明白であることを願っています。私が間違っていることを誰かが知っていますか?

ありがとう

4

5 に答える 5

6

文字列を宣言するときにのみ、文字列に値を割り当てることができます。を使用して後で割り当てることはできません=

関数を使用する必要がありstrcpy()ます。

于 2012-08-29T14:10:23.737 に答える
6

十分な大きさであると仮定すると、次のようSM_NAME_SIZEに使用できます。strcpy

strcpy(one.name, "Alpha");

strcpy を実行する前に、宛先に文字列を保持するのに十分なスペースがあることを確認してください。バッファオーバーフローが発生します。

安全にプレイしたい場合は、次のことができます

if(!(one.name = malloc(strlen("Alpha") + 1))) //+1 is to make room for the NULL char that terminates C strings
{
      //allocation failed
}
strcpy(one.name, "Alpha");  //note that '\0' is not included with Alpha, it is handled by strcpy
//do whatever with one.name
free(one.name) //release space previously allocated

one.nameメモリを無駄にしないように、malloc を使用する場合は必ず解放してください。

于 2012-08-29T14:13:10.537 に答える
2

C には組み込みの文字列型がありません。文字列を保持するには、文字の配列を使用する必要があります。

C では、ある配列を別の配列に代入することもできないため、標準 C ライブラリのさまざまな関数を使用して配列要素をある配列から別の配列にコピーするか、自分でそれを行うループを作成する必要があります。独自のループを作成する理由が時々ありますが、標準 C ライブラリ関数を使用することをお勧めします。

型で使用される標準の ANSI 型文字列の場合、文字列をcharコピーまたは比較する関数など、ほとんどが str で始まる多数の関数があります。または など、コピーまたは比較する最大文字数を指定する別のセットもあります。strcpy()strcmp()strncpy()strncmp()

C の文字列は、バイナリ ゼロ文字で終了する文字の配列です。したがって、"Constant" などの定数文字列を使用すると、文字ごとに 1 つの要素とゼロ ターミネータの追加要素を持つ文字の配列が作成されます。

つまり、char 配列のサイズを変更するときは、ゼロ ターミネータを保持するために配列要素をもう 1 つ追加することも忘れないでください。

strncpy() 関数は、指定された最大文字数まで、またはゼロ終止符が見つかったときに、1 つの char 配列を別の char 配列にコピーします。最大文字数に達した場合、宛先配列はゼロ ターミネータで終了しないため、注意が必要です。

char  one[10];
char  two[20];
strncpy (one, "1234567", 10);  // copy constant to the char buffer max of 10 chars
one[9] = 0;   // make sure the string is zero terminated, it will be this is demo
strcpy (two, one);
strcat (two, " suffix");    // add some more text to the end

UNICODE で使用されるワイド文字を操作する関数もあります。

于 2012-08-29T14:24:53.273 に答える
2

strcpyorを使用strncpyして、C で文字列を割り当てます。

于 2012-08-29T14:09:24.807 に答える
1

使用する:

strcpy(one.name, "Alpha"); //Removed null byte (Read first comment by shf301)

別:

typedef struct SM_DB  
{
    LIST_TYPE           link;
    char*               name;   
} SM_DB_TYPE;

SM_DB_TYPE one;
one.name = malloc(sizeof(char) * (strlen("Alpha") + 1); //Allocate memory
if (!one.name) {
   /* Error handling */
} else {
    strcpy(one.name, "Alpha");
}
于 2012-08-29T14:17:53.110 に答える