2012-04-27 13 views
0

私はC言語の新機能で、構造体配列を扱っています。私はそれに値を割り当てることができません。ここでは、ここでC構造体配列の割り当て問題

struct student{ 
     char firstname[30]; 
     char surname[30]; 
     int streetNo; 
     char streetName[30]; 
     char suburb[30]; 
     char state[4]; 
     int postCode; 
     char DOB[10]; 
     int studentNo; 
     char gender; 
     char courseNo[4]; 
     char active; 
     int WAM; 
    }; 
struct student person[1000]; 

私は構造体

person[100].firstname = "dan"; 

に値を割り当てる..です私の構造体であり、これは私のエラー

Cで
assignment type mismatch: array[30] of char "=" pointer to char 

答えて

3

、このような文字列が実装されています文字配列を使用します。文字配列はあなたが定義したものとまったく同じですが、Cのように文字列を直接割り当てることはできません。文字列関数を使用する必要があります。使用する関数はstrcpy()です。この

char str[] = "dan"; 

のような文字列リテラルから文字の配列を使用すると、文字の配列に文字列リテラルを割り当てないことができますが、を初期化することができますが

strcpy(person[100].firstname, "dan"); 
+0

はとてもうまくいったことありがとうございました!私はstrcpy ahahahahaについて完全に忘れました –

4

- :あなたは次のように割り当てる必要がありますあなたがしようとしている方法。

あなたは、文字列のコピー機能のいずれかを使用して文字配列にコピーあなたの文字列に必要ですよは最初の4つの要素とパッドfirstnameの残りの要素に"dan"をコピーしたい場合

strcpy(person[100].firstname, "dan"); 

ゼロで、strncpyを使用します。

strncpy(person[100].firstname, "dan", 30); 

それはあなたがfirstnameポインタを作ることができることを指摘する価値がある、と動的に文字列のメモリを割り当て、またはそれを直接割り当てる次のいずれか

struct student{ 
    char *firstname; 
    char *surname; 
    /* and so on... */ 
}; 

student[100].firstname = "dan"; 
student[100].surname = "brown"; 
0

配列名自体は、配列のベースアドレスを与えます。..そして、アレイ・ベース・アドレスは、左側の値にすることはできません。

person[100].firstname = 

は、許可されていない配列のベースアドレスに他の値を割り当てるため、エラーが発生します。

あなたは

char stringArray[] = "some string"; 

を初期化することができますが、すでに宣言して値を割り当てることはできません配列

char stringArray[100]; 
    stringArray  = "some string"; <== error 

あなたの代わりには、strcpyの

strcpy(stringArray, "sometext"); 
1

特有の問題があることで使用することです文字列をバイトの配列に代入しようとしています。

strncpy(person[100].firstname, "dan", 30); 

より一般的な問題、あなたがやっていることですひどいです:あなたがその特定のケースで行う必要がありますどのような

はそうは次のように、配列にしたい文字列の内容をコピーすることです。このような学生の記録には、適切なデータベースを使用することだけが賢明なことです。あなたの場合はおそらくSQLiteを使用してください。このような簡単な学習のためにデータベースを使用することは、過剰な人のように見えるかもしれませんが、後で多くの人に役立つ経験です。

4

あなただけの他に、あなたがしても、単純なchar配列

char a[30]; 
a="dan"; 

でそのように行うことができません

strcpy(person[100].firstname,"dan"); 

を使用する必要がある、唯一の宣言時にそのような配列を初期化することができますコンパイラは、「dan」がポインタによって保持されている文字列リテラルなので、

incompatible types when assigning to type ‘char[30]’ from type ‘char *’ 

を通知します。このように配列に割り当てることはできません。

+0

あなたもこのように行くことができます... 'struct student { char * firstName; }人[100]; 人[30] .firstName = "dan"; ' – Addicted

+0

いいえ。これは 'student.firstname'を変更しようとするとすぐに大きな問題になります。 – hirschhornsalz

+0

*宣言時にのみそのような配列を初期化することができます* - ニースキャッチ! – felipsmartins

1

strcpy() char配列に値を割り当てることができます。

strcpy(person[100].firstname,"Dan"); 
1

このように配列に割り当てることはできません。構造体がなくても。つまり、

char name[10]; 
name = "ert"; 

はエラーです。

(あなたが唯一の初期化char name[10] = "ert";でそれを行うことができます)

それを行うための正しい方法は、文字列の最大サイズを必要とstrcpyのバリエーションを使用する

strcpy(person[100].firstname, "dan"); 

安全です。

3

アレイはポインタではなく、これはその一例です。 配列を割り当てることはできません、配列の要素のみに割り当てることができます。 あなたは

person[100].firstname[0] = 'd'; 
person[100].firstname[1] = 'a'; 
person[100].firstname[2] = 'n'; 
person[100].firstname[3] = '\0'; /* Pretty tedious... */ 

を行うことができますか、あなたは30の以上のバイトをコピーしていないことがわかっている場合、

strcpy (person[100].firstname, "dan"); 
関連する問題