2016-11-13 6 views
-8
#include <iostream> 
using namespace std; 
struct student{ 
    char name[10]; 
    int grade; 
}; 


int main() { 
    struct student s[10]; 
    student s[0].name = "Jack"; 
    cout<<s[0].name; 
} 

構造型データstudentを作成したいと思います。私はこのようなことをしたときにいくつかのエラーが現れ、なぜわからなかったのですか。エラーは次のとおりです:構造体に関する問題

1.エラー:異なるタイプの 's'の再定義:student [0] 'vs'構造体の学生[10]」

student s[0].name = "Jack"; 
      ^

2.note:前の定義はここにある

struct student s[10]; 
       ^

3.エラー:予想 ';'宣言

student s[0].name = "Jack"; 
       ^
       ; 
+0

はい、これはコンパイルされません、 'が見つかりませんでした。 '; –

+3

どのようなエラーがありますか?それは重要なことです。重大な注意点として – Carcigenicate

+2

に 'strcpy()'を使用してください。 –

答えて

-1
student s[0].name = "Jack"; 

の最後に上記のステートメントは、エラーが発生します。

C++の文字列に代入演算子 '='を使用することはできません。また、s [x]にアクセスするために構造体名を入力する必要はありません。 strcpy(s[0].name,"Jack");をお試しください。 Strcpyはstring.hで入手できます。

2
  1. char name[10];
    1. 10文字が名前のために短すぎます。
    2. char名前がASCIIまたはUTF-8の外にないと仮定し、Unicodeライブラリを使用しているように見えません。
    3. 文字列を格納するための固定サイズの配列は、イディオム的なC++には対応していません。
    4. ソリューション:std::stringまたはstd::wstringを使用し、Unicodeライブラリを使用してください。
  2. struct student s[10]
    1. これは、慣用のC++ではありません。 structキーワードは不要です。ちょうどstudent s[10];で十分です。
    2. さらに、10個のレコードを使用することがわかっている場合を除き、固定サイズの配列は避けてください。代わりにstd::vector<student>を使用してください。
    3. 配列を初期化しないため、データメンバーに未定義/未初期化データが含まれます。メモリをゼロ・アウトしたり、studentコンストラクタを定義するには、= {0}を使用します。
  3. student s[0].name = "Jack";
    1. これはコンパイルされません。あなたはちょうど入れようとしていると思う。s[0].name = "Jack"
    2. 割り当てオペレータ=は、文字列に対して(デフォルトでは)定義されていません。構造体のメンバ型はcharであり、文字列リテラルはconst char[N]なので、現実にはcharメンバにポインタ(配列の減衰のため)を割り当てていることに注意してください。これは無意味な操作です。
  4. mainは値を返しません。成功するにはreturn EXIT_SUCCESS;を使用してください。これは厳密には必須ではありませんが、私は個人的には明示的に値を返すことをお勧めします。
+0

ありがとう、私はちょうどこれらのことを学び始めたので、あなたの言葉の一部を本当に理解できません。私の英語もあまり良くありません。再度、感謝します。 – swaggyp86

+0

あなたのポイントについて4. C++標準では、実際に 'main'の終わりに値を返さずに(* only *関数として)落ちると、0を返します。これはバグではありませんが、定義された動作。 –

+0

@JesperJuhlそれを指摘していただきありがとうございます、私は私の答えを更新しました。 – Dai