Sono un po 'confuso sui metodi di base in cui i programmatori codificano in modo diverso in C e C++. Una cosa in particolare è l'uso di stringhe in C++ su array di caratteri, o viceversa. Quindi, dovrei usare stringhe o array di caratteri, in generale, e perché?C++: dovrei usare stringhe o array di caratteri, in generale?
risposta
In C++ si dovrebbe in quasi tutti i casi utilizzare std::string
anziché un array di caratteri non elaborati.
std::string
gestisce la memoria sottostante per te, che è di per sé una ragione sufficiente per preferirlo.
Fornisce inoltre una molto più facile da usare e un'interfaccia più leggibile per operazioni di stringa comuni, ad es. test di uguaglianza, concatenazione, operazioni di sottostringa, ricerca e iterazione.
La facilità d'uso è la ragione numero 1 per me. –
Si potrebbe menzionare l'eccezione principale che si interfaccia con le librerie C esistenti e anche quelle che richiedono solo input possono semplicemente prendere un const char * da your_string.c_str() –
Utilizzare std::string
. Avrai meno problemi (credo quasi nessuno, almeno nessuno mi viene in mente) con dimensioni del buffer.
C ha char [] mentre C++ è std :: string troppo ...
ho comunemente sentito che si dovrebbe "Abbracciate la lingua" e, seguendo questa regola, si dovrebbe usare std :: string ..
Tuttavia, è quasi tutto ciò che si sta utilizzando in libreria, in che modo tale libreria desidera che si esprimano le stringhe, cose del genere.
std :: string è una classe contenitore e al suo interno è un carattere []
Se si utilizza std :: string, si hanno molti vantaggi, come le funzioni che possono essere d'aiuto [confrontare, substr, come esempi]
E se la libreria è "lame" e non supporta le stringhe , c'è sempre std :: string :: c_str()! – physicsmichael
Altri hanno messo. Usa la roba std :: string ovunque sia possibile. Tuttavia ci sono aree in cui hai bisogno di char *, ad esempio se ti piace chiamare alcuni servizi di sistema.
C'è 'std :: string :: c_str()' per questo motivo. – swegi
@swegi: molte API prevedono un 'char *' e non un 'const char *' (ad esempio, la maggior parte, se non tutti, di WinAPI). In questi casi, tuttavia, è una buona idea usare un 'std :: vector
@James McNellis è ciò che const_cast è per. – mch
Se si modifica o si restituisce la stringa, utilizzare std::string
. In caso contrario, accettare il parametro come const char*
a meno che non si abbia assolutamente bisogno delle funzioni membro std::string
. Ciò rende la funzione utilizzabile non solo con std::string::c_str()
ma anche stringhe letterali. Perché il tuo chiamante paga il prezzo della costruzione di uno std::string
con spazio di archiviazione sufficiente per passare letteralmente?
Non sono d'accordo. Al contrario: prendi sempre una 'stringa' (o almeno una stringa di base'
' stringa' non è convertibile da 'char *'. 'string' è costruibile da' char * ', e causa allocazione e frammentazione dell'heap. (Per favore, non downvotare a meno che tu non abbia una risposta all'ultima frase della mia risposta.) E il contrario funziona perfettamente con la funzione membro 'c_str()' (che è ciò che ho già menzionato nella mia risposta). E i puntatori non sono lì solo per la retrocompatibilità, né per mantenere valori singoli. Al contrario, fanno grandi iteratori e tutti gli algoritmi di libreria standard sono progettati con cura per funzionare correttamente se gli iteratori sono puntatori. –
@Ben: +1 Mi piace questa idea, anche se non l'ho vista molto usata nella pratica. Immagino dipenda da come finisci per usare la corda. Tecnicamente, 'stringa' _is_ convertibile da' char * ': un costruttore non esplicito a parametro singolo è un" costruttore di conversione "e rientra nella categoria delle conversioni definite dall'utente. Ciò non significa che chiamarlo sia economico, ovviamente. –
Come nel caso di tutto ciò che si sceglie dipende da ciò che si sta facendo con esso. std :: string ha un valore reale se hai a che fare con dati di stringhe che cambiano. Non è possibile battere char [] per l'efficienza quando si ha a che fare con stringhe immutabili.
Grazie per gli unanimi sentimenti di std :: string a tutti! – physicsmichael
Perché reinventare la ruota. Utilizzare la classe di stringhe. – rocknroll