2017-08-19 2 views
0

Gibt es einen manuellen Weg, um die Zeichenfolge in struct zu initialisieren? i verwendet Zeichenfolge in Struktur zu initialisieren strcpy Funktion wie:Wie initialisiert man string in struct ohne die strcpy Funktion?

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

'Mitarbeiter Hinter x = {.age = 25, .name = "sam"};' – BLUEPIXY

+0

Warum? Da deine Frage absurd erscheint, erkläre warum. – gnasher729

+0

Um in ein Array fester Größe zu kopieren, sollten Sie immer strncpy() oder strncpy_s verwenden, falls verfügbar. –

Antwort

7

Genau diese

strcpy(x.name,"sam"); 

sprechen ist keine Initialisierung.

wenn über die Initialisierung zu sprechen, dann können Sie es auf folgende Weise

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

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

oder

tun, ist dies gleichbedeutend mit der folgenden Initialisierung

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

oder

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

Oder Sie können sogar ein zusammengesetztes Literal des Typs employee verwenden, um das Objekt x zu initialisieren, obwohl das nicht effizient ist.

Ansonsten wenn es sich nicht um eine Initialisierung sondern um eine Zuweisung des Datenelements der Struktur handelt dann müssen Sie in der Tat mindestens strcpy oder strncpy verwenden.

+1

Gute Antwort neben "Verbindung buchstäblich ... obwohl das nicht effizient ist.". Sicherlich wird ein guter Compiler dies ebenso wie andere Ansätze optimieren. – chux

+0

Zuordnung kann ein _compound literal_ ohne 'strcpy()' und Freunde verwenden. – chux

-1

Sie können Ihre eigene Version von strcpy schreiben:

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

Sie sind nicht strcpy mehr verwenden. Plus es ist sicherer.

+2

Sie sollten dies eindeutig als "sarkastisch" markiert haben. Ich nehme an, es ist sarkastisch. Wenn nicht, sollte Ihr Arbeitgeber Angst haben. – gnasher729

+0

@ gnasher729 warum sollte mein Chef meine Angst haben? Diese Version ist sicherer – stackptr

+1

Ich habe nicht so schlecht geschrieben geschrieben einfache Funktion seit Jahren –

-1

max - einschließlich Null

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';' gehört zu 'if (max)' – chux

Verwandte Themen