1

C で継承をシミュレートしていますが、その言語にはあまり詳しくありません。以下はコードの一部です。Visual Studio には次のようなエラー メッセージがemp.name=nあります。

式は変更可能な左辺値でなければなりません。

変更できるように変更するにはどうすればよいですか?

typedef struct {    
        char name[20]; 
        double salary;  
        } Employee;

Employee newEmployee(char n[], double s)
{
    Employee emp;
    emp.name=n;
    emp.salary=s;
    return emp;
}
4

3 に答える 3

5

nからにデータをコピーする必要がありますEmployee.name

strncpy(emp.name, n, 20);

ただし、nが NULL で終了していない場合、問題が発生します。emp.name次のコードを使用して、NULL で終わる文字列になることを保証します。

strncpy(emp.name, n, 19);
emp.name[19] = '\0';
于 2012-05-11T00:13:05.820 に答える
1

他のポスターは、strncpy を使用するように誘導するのに適しています。

strcpy と strncpy に関するコメントが生じるのは、strcpy では src 文字バッファーがヌルで終了する必要があるためです。最後の文字'\0' 文字でなければなりません。この規則に従わないと、プログラムがセグメンテーション違反で予期せず終了します。そんな時はただただ恥ずかしい。

受信したエラー メッセージは、 char[] を emp.name に割り当てようとすることで、 struct 内の name 要素のアドレスを変更しようとしことを指摘していました。メモリのアドレスを変更することはできません。したがって、質問に対する正確な答えは、emp.name はメモリ内のアドレスであり、変更できないため、決して変更できないということです。

あなたの頭の中では、emp.name を char 配列 n のデータに変更したいと考えていますが、emp.name のアドレスは変更できません。strncpy は、char 配列 n に含まれるデータを、emp.name アドレスが指す 20 バイトにコピーします。

うまく説明できていないかもしれませんが、もっと質問してください。他の投稿者は、この回答を修正または改善できます。

これは、C の学習で難しい部分です。いくつかのアセンブリ言語を学ぶことは有益です。C でコーディングしているときは、アセンブラを書く上で C 言語のキーワードの薄い層になっていることを覚えておくと便利です。

于 2012-05-11T00:47:19.067 に答える
1

C で文字列をコピーするには、strcpy()または相対 ( strncpy()memmove()、 、 ...)を使用する必要があります。memcpy()

strcpy(emp.name, n);

これは、文字列の長さがEmployee 構造体nよりも短いことを前提としています。nameそうでない場合は、問題があります。

于 2012-05-11T00:13:27.173 に答える