2010-04-16 6 views
15

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?

+1

Grazie per gli unanimi sentimenti di std :: string a tutti! – physicsmichael

+1

Perché reinventare la ruota. Utilizzare la classe di stringhe. – rocknroll

risposta

28

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.

+5

La facilità d'uso è la ragione numero 1 per me. –

+4

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() –

1

Utilizzare std::string. Avrai meno problemi (credo quasi nessuno, almeno nessuno mi viene in mente) con dimensioni del buffer.

1

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]

+2

E se la libreria è "lame" e non supporta le stringhe , c'è sempre std :: string :: c_str()! – physicsmichael

1

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.

+3

C'è 'std :: string :: c_str()' per questo motivo. – swegi

+0

@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 ' e convertirlo tra esso e 'std :: string' come necessario. –

+0

@James McNellis è ciò che const_cast è per. – mch

10

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?

+0

Non sono d'accordo. Al contrario: prendi sempre una 'stringa' (o almeno una stringa di base' ') perché è semplicemente migliore di' char * '. Se l'utente ha una matrice raw di 'char', allora funziona anche lui:' string' è convertibile da 'char *'. L'altro modo non funziona. 'char' è qui solo per compatibilità all'indietro con il codice C, per accettare un singolo carattere non elaborato e per i casi in cui è specificamente necessario un elemento dati di dimensione 1. – wilhelmtell

+5

' 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. –

+3

@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. –

0

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.