Хотите прямо сейчас получить бесплатный видеокурс по программированию для начинающих?

Работа со строками в С++…

Июнь 28, 2011

Привет и доброго времени суток всем! =)

Вот сколько уже вожусь с С++ никак не могу привыкнуть к работе со строками в этом языке. Порой просто злость берёт — «Это кто ж столько строковых типов по напридумывал!?». Скорее всего и у вас такое было.

На самом деле такое безумное количество типов строк обусловлено развитием языка. Ведь С++ создавался как крутая альтернатива ассамблеру с возможностями высокоуровневого программирования. Вот и получается что есть типы удобные и высокоуровневые и низкоуровневые не совсем удобные. С конвертацией часто возникают проблемы многие старые мануалы уже не работают, а новые найти бывает трудновато.

Вопрос с правильной конвертацией из одного строкового типа в другой мы решим раз и на всегда при помощи этой статьи (актуально для Microsoft Visual C++ 2008, скорее всего подойдет и для последующих версий MSVC):

Из char в String

char *a = "Строка";
String ^s = gcnew String(a);
Console::WriteLine(s);

Из wchar_t в String

wchar_t a[] = L"Строка"; // можно написать TEXT("Строка")
// но тогда нужно прибавить модуль #include
String ^s = gcnew String(a);
Console::WriteLine(s);

Из string в String (не забывайте про регистр букв)

std::string a = "Строка"; //можно было написать namespace std;
String ^s = gcnew String(a.c_str());
Console::WriteLine(s);

Из wchar_t в char

Способ 1:
wchar_t *a = L"Stroka";
char *s = (char*)malloc(50); //malloc(50) задает размер зарезервированных
//байтов под строку. Результат выдается в формате char * ;
size_t i;
wcstombs_s(&i,s,50,a,50); //первый операнд - возвращает количество успешно сконвертированных символов
//второй - выходные данные
//третий - размер буфера для конвертации
//четвертый - входные данные
//пятый - максимальная длинна результирующей строки
Console::WriteLine(gcnew String(s));
// данный способ подходит только для английского языка, русский язык - вызывает ошибку.

Способ 2:
wchar_t *a = L"Строка Stroka"; //за место L лучше использовать TEXT("Строка Stroka")
char *s=(char*)malloc(50);
WideCharToMultiByte(1251, 0, a, -1, s, 50, NULL, 0);
//подробнее о операндах тут - msdn.microsoft.com/en-us/library/dd374130%28v=vs.85%29.aspx
//только не забудьте #include добавить
Console::WriteLine(gcnew String(s));
//Также можно повлиять на кодировку при помощи переключения кодировки в настройках проекта.

Из string в char

std::string a = "Строка Stroka";
char *s=(char*)malloc(50);
strcpy_s(s,50,a.c_str()); //50 в данном случае длинна строки
Console::WriteLine(gcnew String(s));

Из String в char

String ^a = "Строка Stroka";
pin_ptr w= PtrToStringChars( a); //меняем тип указателя.
// Подробнее тут - msdn.microsoft.com/ru-ru/library/1dz8byfh
//Нужно добавить модуль #include
char *s=(char*)malloc(50);
WideCharToMultiByte(1251, 0,w, -1,s, 50, NULL, 0);
Console::WriteLine(gcnew String(s));

Из char в wchar_t

char *c = "Строка Stroka";
wchar_t w[50]; //50 - длинна строки
MultiByteToWideChar(1251, 0, c, -1, w, 50);
Console::WriteLine(gcnew String(w));

Из string в wchar_t

std::string s = "Строка Stroka";
wchar_t w[50];
char *c=(char*)malloc(50);
strcpy_s(c,50,s.c_str());
MultiByteToWideChar(1251, 0, c, -1, w, 50);
Console::WriteLine(gcnew String(w));
//в этом примере конвертация проходит через тип char

Из String в wchar_t

String ^s = "Строка Stroka";
wchar_t w[50];
pin_ptr w2 = PtrToStringChars(s); // не забудьте модуль #include
wcscpy_s(w,w2);
Console::WriteLine(gcnew String(w));


Надеюсь это поможет вам. Все примеры протестированы мною лично.
Если есть что добавить — пишите в комментариях, так как я костным мозгом чую что список конвенций не полный и что то возможно я упустил.

С уважением Артём.


krasnoyarsk.high-ball.ru



21 Комментариев к записи Работа со строками в С++…

  1. Michail on 29.06.2011 at 00:25

    Привет Артём!
    Для начинающих «чайников» всё это наводит ужас :shock:

    С уважением Михаил

  2. Артём Кашеваров on 29.06.2011 at 02:02

    Увы сама Visual C++ наводит страх на начинающих =( покрайней мере так было со мной…
    Зато C++ Builder — копия Delphi только с другим синтаксисом. эт радует =)

  3. Аркадий on 29.06.2011 at 02:55

    wchar_t a[] = L»Строка»; // можно написать TEXT(«Строка»)
    // но тогда нужно прибавить модуль #include

    Что это за нонсенс после буквы L ?
    И вообще, разьве в С++ есть двойные угловые скобки?
    Зачем намекать про #include, просто подключите то что надо!

    • Артём Кашеваров on 29.06.2011 at 03:33

      Извиняюсь это стили перепортили немного текст. Уже исправил всё. Угловых кавычек должны быть двойные верхние запятые .

  4. Аркадий on 29.06.2011 at 03:56

    А в моём коде почему не исправляется?

  5. михаил on 14.07.2011 at 12:17

    А вы не работаете где-нибудь программистом, только пишете уроки?

    • Артём Кашеваров on 14.07.2011 at 16:57

      Раньше делал на заказ программы. Сейчас времени почти не стало. Честно сказать сейчашняя моя работа в разы трудней и я ищу единомышленников чтоб хотя бы помогли делать видео для блога.

  6. flisk on 18.07.2011 at 15:53

    Артем, спасибо большое! очень помог.

  7. Илья on 18.07.2011 at 18:59

    А вы в borland c++ builder разбираетесь?
    Где последнюю версию его можно будет бесплатно скачать под вин7

    У меня есть версия 6.0, но она на вин7 пошла только из-за того что раньше стояла вин SP3, из-за этого и глючит borland.

    Вопрос, а можно где-то или как-то бесплатно получать уроки, очень хочу научиться программировать, но денег нет

    Ещё интересно научиться на brain fuck или машинном языке хоть что-то делать

  8. adamo86 on 21.08.2011 at 15:12

    Мне информация очень помогла. Сохранил страницу в моем справочнике по C++. Спасибо!

  9. Пришлый on 10.10.2011 at 20:09

    Спасибо за блог! Поржал! :) Заряд хорошего настроения получен :)

    Подумай, программа использующая код

    char *a = «Строка»;
    String ^s = gcnew String(a);
    Console::WriteLine(s);

    запустится на компьютере с только что установленной Windows XP?
    То есть на такой, на которой нет .NET Framework.

  10. rahim on 29.03.2012 at 17:13

    Зраствуйте Артём кашеваров ! Расскажу о себе мне 14 лет и я заинтересован в программирование вот подскажите пожалуйста какой язык лутше учить первым вот я выучил языки HTML & CSS

    Теперь как изучить лутше язык php или delphi а потом уже С++
    так лутше или ещё надо будет после php изучить javascript
    Как легче будет подскажите пожалуйста Заранее спасибо?***

  11. rahim on 29.03.2012 at 17:15

    А хочу очень стать помощником вам помогать после изучение такое возможно правда я хочу стать программистом я уже чуть чуть знаю php и javascript но я ещё буду учить как вы подскажите ! ??

  12. Артём on 31.03.2012 at 14:53

    Здраствуйте артем кашеваров! Я бы хотел узнать с чего мне начать !с какого языка программирования подскажите пожалуйста я уже знаю языки html & css ??

    • Артём Кашеваров on 17.04.2012 at 17:31

      Я всегда рекомендую Basic -> Pascal -> Delphi
      Хотя первые 2 немного устарели, но для набивания руки — самое то!

  13. Артём on 31.03.2012 at 14:55

    Просто ваше мнение для меня лутше чем другое мнение потомучто вы программист и понимаете и вы проходили через всё это?

  14. Иван on 15.10.2012 at 02:45

    Артем, не путай праведное с грешным. Все что ты написал хорошо, но относится не к чистому С++, а к С++/CLR. Если ты нечто такое подсунешь например GCC, то ниче не выйдет, первый же String^ и gcnew коту под хвост. А тут надо сказать, что С++/CLR компилируется так же как и все остальные .NET языки в IL а не в машинный код, следовательно эффективность выполнения ниже, и оптимизация по скорости не так доступна, как для Native code, хотя по прежнему компилятор проглотит твою опцию -O2 и попытается изо всех сил оптимизировать выходной IL.

Добавить комментарий для Пришлый Отменить ответ

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Поддержите проект

Хит продаж:

Случайный анекдот

Моя вторая книга

Что это???

Программирование для Android:

Мы вконтакте

Помощь сайту

Понравился сайт? Он сильно нуждается в раскрутке.

Чтобы помочь в раскрутке - опубликуйте ссылку на сайт (или любую его страницу) на любом другом сайте в интернете. Тогда сайт станет чуточку популярнее.

Или просто нажмите на кнопки социальных сетей которые стоят в конце каждой статьи

Вместе мы сможем сделать программирование более популярным и более понятным для всех!

Заранее спасибо!
Артём Кашеваров.