0

だから私は今 C を学ぼうとしていて、解決したいいくつかの基本的な構造体の質問があります。

基本的に、すべては次のコード スニペットを中心にしています。

#include <stdio.h>
#include <stdlib.h>

#define MAX_NAME_LEN 127

typedef struct {
    char name[MAX_NAME_LEN + 1];
    unsigned long sid;
} Student;

/* return the name of student s */
const char* getName (const Student* s) { // the parameter 's' is a pointer to a Student struct
    return s->name; // returns the 'name' member of a Student struct
}

/* set the name of student s
If name is too long, cut off characters after the maximum number of characters allowed.
*/
void setName(Student* s, const char* name) { // 's' is a pointer to a Student struct |     'name' is a pointer to the first element of a char array (repres. a string)
    s->name = name;
}

/* return the SID of student s */
unsigned long getStudentID(const Student* s) { // 's' is a pointer to a Student struct
    return s->sid;
}

/* set the SID of student s */
void setStudentID(Student* s, unsigned long sid) { // 's' is a pointer to a Student struct | 'sid' is a 'long' representing the desired SID
    s->sid = sid;
}

ポインターの理解を深めるために、コードにコメントを追加しました。それらがすべて正確であることを願っています。

とにかく、setName と setStudentID が正しくない気がしますが、その理由はよくわかりません。誰か説明できますか?ありがとう!

編集:

 char temp
 int i;
 for (i = 0, temp = &name; temp != '\0'; temp++, i++) {
     *((s->name) + i) = temp;
4

3 に答える 3

5

これでフルネーム配列をコピーしていません

void setName(Student* s, const char* name) { 
   s->name = name;
}

これを試して

strcpy(s->name,name);

この文字列を構造体配列にコピーします。現在のように、ポインター引数を配列変数に単純に割り当てることはできません。が指す各文字をname配列の要素にコピーする必要がありますs->name。これが何strcpyをするかです - 終端のヌル文字が見つかるまで、ソースから宛先に要素をコピーします。

strncpy編集:または、コメントで提案されているように使用することもできます。この質問とその回答をチェックして、これが良い考えだと考える人がいる理由を確認してください。 strcpy の代わりに strncpy を使用する理由は?

于 2012-09-09T09:36:33.677 に答える
3
s->name = name;

s->nameは配列であるため、割り当てることはできません(変更可能な左辺値ではありません)。これはコンパイラ エラーである必要があります。あなたはstrcpyそれに入る必要がありますが、大きすぎないmemcpyことを確認してください.name

于 2012-09-09T09:35:41.610 に答える
1

setStudentID はまったく問題ありませんが、setStudentName はそうではありません。char* を配列に割り当てようとしていますが、うまくいきません。strcpyのように、要素ごとにコピーする関数を使用する必要があります。

于 2012-09-09T09:36:43.213 に答える