2017-08-19 17 views
0

構造体の文字列を初期化する手作業はありますか?あなたはもうstrcpyを使用していないstrcpy関数を使わずにstruct内の文字列を初期化する方法は?

void mycopy(char *dest, const char *source, size_t ndest) 
{ 
    assert(ndest != 0); 
    while (--ndest > 0 && (*dest++ = *source++)) 
     ; 
} 

:あなたはstrcpyの独自のバージョンを書くことができ

typedef struct { 
    int id; 
    char name[20]; 
    int age; 
} employee; 


int main() 
{ 

    employee x; 
    x.age=25; 

    strcpy(x.name,"sam"); 
    printf("employee age is %d \n",x.age); 
    printf("employee name is %s",x.name); 

    return 0; 
} 
+2

'社員X =末尾含む;' – BLUEPIXY

+0

なぜ?あなたの質問がばかげているように見えるので、理由を説明してください。 – gnasher729

+0

を固定長配列にコピーするには、strncpy()またはstrncpy_s(使用可能な場合)を常に使用する必要があります。 –

答えて

7

初期設定ではありません。

初期化について話すためにならば、あなたはそれを次のように行うことができます

employee x = { .name = "sam", .age = 25 }; 

または

employee x = { .name = { "sam" }, .age = 25 }; 

これは、次の初期化と等価である

employee x = { 0, "sam", 25 }; 

または

employee x = { 0, { "sam" }, 25 }; 

また、オブジェクトxを初期化するために、タイプemployeeの複合リテラルを使用することもできますが、これは効率的ではありません。

それ以外の場合は、構造のデータメンバーの初期化ではなく、実際にはstrcpyまたはstrncpyを使用する必要があります。

+1

"化合物のリテラル...を除いて良い答えですが、それは効率的ではありません。"確かに良いコンパイラは、他のアプローチと同様に最適化します。 – chux

+0

割り当ては、 'strcpy()'や友達なしで_compound literal_を使うことができます。 – chux

-1

:私は、次のようなstrcpyの関数を使用して、構造体の文字列を初期化するために使用しました。さらに安全です。厳密にこの

strcpy(x.name,"sam"); 

を話す

+2

あなたはこれを "皮肉"と明確に記しておくべきです。私は皮肉だと思う。もしそうでなければ、あなたの雇用主は恐怖を感じるべきです。 – gnasher729

+0

@ gnasher729なぜ私の上司は私の怖いべきですか?このバージョンはより安全です – stackptr

+1

私はそれほどひどく書かれていませんシンプルな関数を何年も書いています –

-1

マックス - {.age = 25、.nameの= "SAM"}ゼロ

char *mystrncpy(char *dest, const char *src, size_t max) 
{ 
    char *tmp = dest; 

    if (max) 
    { 
     while (--max && *src) 
     { 
      *dest++ = *src++; 
     } 

    *dest++ = '\0'; 
    } 
    return tmp; 
} 
+1

'* dest ++ = '\ 0';'内部に属していますif(max) ' – chux

関連する問題