2016-05-06 1 views
0

In C++, wenn Sie ein Array von Zeichen übergeben, wenn Sie eine Klasse instanziieren, ist es möglich, die Bytes, die kopiert werden, zu begrenzen, um einen Überlauf zu verhindern, wenn Sie unsicher sind, wie viele Zeichen kommen?Überlauf verhindern, wenn ein Array von Zeichen an einen Klassenkonstruktor übergeben wird, der die Initialisierung des Konstruktors verwendet?

Meine Implementierung basiert nicht auf Benutzereingaben, also weiß ich, dass es in Ordnung sein wird, aber ich frage mich nach allgemeinem Wissen.

z.B. (von this post)

class test2 { 
    char name[40]; 
public: 
    test2() : name("Standard") {}; 
    void display() { cout << name << endl; } 
}; 

z.B. (Bearbeitete Version this post)

class test2 { 
    char name[40]; 
public: 
    test2(const char *charsComingIn) : name(charsComingIn) {}; 
    void display() { cout << name << endl; } 
}; 

Als Nebenbemerkung, ich habe nicht das zweite Beispiel getestet, aber das ist der Kern das, was ich versuche im Moment zu tun. Alle Korrekturen sind zum Konzept der Durchführung willkommen.

+3

Sie können ein 'char [40]' nicht von einem 'const char *' initialisieren, also ... Problem vermieden! –

+2

Es gibt 'strncpy'. In der Regel wird dies den verwalteten Lösungen wie 'std :: string' unterlegen. –

+0

Sie übergeben kein Array von Zeichen. – immibis

Antwort

1

könnten Sie strncpy verwenden und möglicherweise gestutzt:

test2(const char *charsComingIn) { 
    strncpy(name, charsComingIn, sizeof(name)); 
    name[sizeof(name)-1] = '\0'; 
} 

Dies wird definitiv nicht überläuft. Der Benutzer würde jedoch nicht wissen, ob Sie abgeschnitten haben. Wenn Letzteres ein Problem darstellt, möchten Sie möglicherweise eine Ausnahme auslösen.

Oder Sie könnten nur Arrays ermöglichen, die klein genug sind:

template <size_t N, class = std::enable_if_t<(N <= 40)>> 
test2(const char (&in)[N]) { 
    memcpy(name, in, N); 
} 

Welche nicht willkürlich c-strings erlauben würde.

Verwandte Themen