W jaki sposób można obsłużyć ciągi w C ++?

głosy
17

Jaki jest twój ulubiony sposób, aby przejść z ciągów w C ++? Tablicy C rodzaju chars? Lub wchar_t? CString, std::basic_string, std::string, BSTRLub CComBSTR?

Z pewnością każdy z nich ma swój własny obszar zastosowań, ale w każdym razie, co jest Twoim ulubionym i dlaczego?

Utwórz 25/09/2008 o 14:35
źródło użytkownik
W innych językach...                            


16 odpowiedzi

głosy
32

std :: string lub std :: wstring, w zależności od potrzeb. Czemu?

  • Są standardowe
  • Są przenośne
  • Mogą one obsługiwać i18n
  • Mają gwarancje wykonania (zgodnie z normą)
  • Zabezpieczone przed przepełnienia bufora i podobnymi
  • Są łatwo przekształcić do innych rodzajów w zależności od potrzeb
  • Są ładnie matrycy, co daje szeroki wachlarz możliwości przy jednoczesnym zmniejszeniu kodu uwędzić i poprawy wydajności. Naprawdę. Kompilatory, które nie mogą obsługiwać szablony dawno minęły teraz.

Macierz C-styl znaków jest tylko kłopoty. Nadal musisz radzić sobie z nimi od czasu do czasu (i to std :: string.c_str () jest za), ale szczerze - jedno z największych niebezpieczeństw w C programiści robią Bad Things z char * i likwidacji z przepełnienia bufora. Tylko nie rób tego.

Tablica wchar__t to samo, tylko większe.

CString, BSTR i CComBSTR nie są standardowe i nie przenośne. Ich unikać, chyba że absolutnie zmuszony. Optymalnie, po prostu przekonwertować std :: string / std :: wstring do nich, gdy są potrzebne, co nie powinno być bardzo kosztowne.

Zauważ, że std :: string jest tylko dzieckiem std :: basic_string, ale wciąż jesteś lepiej wyłączyć za pomocą std :: string, chyba że masz naprawdę dobry powód, aby nie. Naprawdę dobry. Niech kompilator dbać o optymalizacji w tej sytuacji.

Odpowiedział 25/09/2008 o 14:51
źródło użytkownik

głosy
8

std :: string !!

Jest powód, dlaczego nazywają go „Standard”.

basic_string jest szczegółów wdrażania i powinny być ignorowane.

BSTR & CComBSTR tylko na współdziałanie z COM i tylko na moment współdziałanie.

Odpowiedział 25/09/2008 o 14:42
źródło użytkownik

głosy
6

std :: string chyba muszę zadzwonić API, które konkretnie ma jedną z innymi, że wymienione.

Odpowiedział 25/09/2008 o 14:40
źródło użytkownik

głosy
5

Oto artykuł porównując najczęstsze rodzaje strun w C ++ i jak konwertować między nimi. Rozwikłania Struny w Visual C ++

Odpowiedział 19/11/2008 o 23:11
źródło użytkownik

głosy
4

Jeśli można użyć MFC, użyj cstring. Inaczej używać std :: string. Plus, std :: string działa na każdej platformie, która obsługuje standard C ++.

Odpowiedział 25/09/2008 o 14:41
źródło użytkownik

głosy
3

Jestem dev Qt, więc oczywiście staram się w miarę możliwości korzystać z QString :).

To całkiem miłe: zgodny z Unicode, bezpieczny wątku ukryte podziału (aka kopiowanie przy zapisie), a chodzi o API przeznaczone do rozwiązywania praktycznych problemów świata rzeczywistego (Split, dołącz wymienić (z lub bez regex), przekształcenie do / z numerami ...)

Jeśli nie mogę korzystać z QString, a następnie std :: wstring. Jeśli utkniesz z C, polecam glib GString.

Odpowiedział 25/09/2008 o 15:21
źródło użytkownik

głosy
3

Gdy mam do wyboru (zwykle nie), staram się używać std :: string z kodowaniem UTF-8 (i pomocy UTF8 CPP bibliotece. Nie dlatego, że lubię std :: string, że dużo, ale przynajmniej jest standardem i przenośne.

Niestety, w niemal wszystkich projektach rzeczywistych Pracowałem na nastąpiły wewnętrzne klasy stringów - większość z nich faktycznie lepiej niż std :: string, ale nadal ...

Odpowiedział 25/09/2008 o 15:08
źródło użytkownik

głosy
2

Jeśli używasz MFC, użyj cstring. W przeciwnym razie zgadzam się z większością innych, std :: string lub std :: wstring całą drogę.

Microsoft mógłby zrobić światu ogromną przysługę dodając std :: basic_string <TCHAR> przeciążeń w ich najnowszej aktualizacji MFC.

Odpowiedział 19/11/2008 o 23:35
źródło użytkownik

głosy
2

Inne, std :: wstring.

std :: string jest technologia 20 wieku. Użyj Unicode i sprzedać do 6 miliardów ludzi, a nie 300 mln.

Odpowiedział 25/09/2008 o 14:46
źródło użytkownik

głosy
2

Używać std::string(lub basic_string<TCHAR>), gdy tylko możliwe. Jest to dość uniwersalny (tak jak CStringT), to typ-safe (inaczej printf) i jest ona dostępna na każdej platformie.

Odpowiedział 25/09/2008 o 14:43
źródło użytkownik

głosy
2

tablice char C-style mają swoje miejsce, ale jeśli ich używać obszernie prosicie tracić czasu debugowania off by one. Posiadamy własny klasa ciąg dostosowane do wykorzystania w naszym środowisku programistycznym (wbudowany).

Nie używamy std :: string, ponieważ nie zawsze jest dostępny dla nas.

Odpowiedział 25/09/2008 o 14:38
źródło użytkownik

głosy
1

Zależy od aplikacji ... Zrobiłem rozległe programowania osadzony i zwykle używają tablic znaków. Tworzenie nowego obiektu ciąg trwa cykli zegara, które są marnowane przez większość mojego manipulacje smyczkowych.

Odpowiedział 25/09/2008 o 20:21
źródło użytkownik

głosy
1

std :: string jest lepsze niż nic, ale jest to denerwujące, że brakuje podstawowych funkcji takich jak Split, dołącz i nawet przyzwoity wezwanie formacie ...

Odpowiedział 25/09/2008 o 15:00
źródło użytkownik

głosy
1

Unicode jest przyszłość. Nie używać char * i std :: string. Proszę) Jestem zmęczony błędów lokalizacyjnych.

Odpowiedział 25/09/2008 o 14:54
źródło użytkownik

głosy
1

std :: string i std :: wstring jeśli mogę, a co innego, jeśli muszę.

Nie mogą one być doskonałym, ale są dobrze sprawdzone, dobrze znane i bardzo wszechstronne. Grają ładnie z resztą biblioteki standardowej, która jest również ogromny bonus.

Warto również wspomnieć, stringstreams .

Odpowiedział 25/09/2008 o 14:49
źródło użytkownik

głosy
1

Lubię używać TCHAR który jest zdefiniowanie dla WCHAR lub char zgodnie z ustawieniami projektów. Jest zdefiniowana w tchar.h gdzie można znaleźć wszystkie powiązane definicje funkcji i typów trzeba.

Odpowiedział 25/09/2008 o 14:47
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more