Работа со строками в С++…
Привет и доброго времени суток всем! =)
Вот сколько уже вожусь с С++ никак не могу привыкнуть к работе со строками в этом языке. Порой просто злость берёт — «Это кто ж столько строковых типов по напридумывал!?». Скорее всего и у вас такое было.
На самом деле такое безумное количество типов строк обусловлено развитием языка. Ведь С++ создавался как крутая альтернатива ассамблеру с возможностями высокоуровневого программирования. Вот и получается что есть типы удобные и высокоуровневые и низкоуровневые не совсем удобные. С конвертацией часто возникают проблемы многие старые мануалы уже не работают, а новые найти бывает трудновато.
Вопрос с правильной конвертацией из одного строкового типа в другой мы решим раз и на всегда при помощи этой статьи (актуально для 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
// Подробнее тут - 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
wcscpy_s(w,w2);
Console::WriteLine(gcnew String(w));
Надеюсь это поможет вам. Все примеры протестированы мною лично.
Если есть что добавить — пишите в комментариях, так как я костным мозгом чую что список конвенций не полный и что то возможно я упустил.
С уважением Артём.
Понравилась статья? Жми: | Поделиться в соц. сетях |
Привет Артём!
Для начинающих «чайников» всё это наводит ужас :shock:
С уважением Михаил
Увы сама Visual C++ наводит страх на начинающих =( покрайней мере так было со мной…
Зато C++ Builder — копия Delphi только с другим синтаксисом. эт радует =)
wchar_t a[] = L»Строка»; // можно написать TEXT(«Строка»)
// но тогда нужно прибавить модуль #include
Что это за нонсенс после буквы L ?
И вообще, разьве в С++ есть двойные угловые скобки?
Зачем намекать про #include, просто подключите то что надо!
Извиняюсь это стили перепортили немного текст. Уже исправил всё. Угловых кавычек должны быть двойные верхние запятые .
А в моём коде почему не исправляется?
какие ошибки? какая среда разработки?
А вы не работаете где-нибудь программистом, только пишете уроки?
Раньше делал на заказ программы. Сейчас времени почти не стало. Честно сказать сейчашняя моя работа в разы трудней и я ищу единомышленников чтоб хотя бы помогли делать видео для блога.
Артем, спасибо большое! очень помог.
А вы в borland c++ builder разбираетесь?
Где последнюю версию его можно будет бесплатно скачать под вин7
У меня есть версия 6.0, но она на вин7 пошла только из-за того что раньше стояла вин SP3, из-за этого и глючит borland.
Вопрос, а можно где-то или как-то бесплатно получать уроки, очень хочу научиться программировать, но денег нет
Ещё интересно научиться на brain fuck или машинном языке хоть что-то делать
Мне информация очень помогла. Сохранил страницу в моем справочнике по C++. Спасибо!
Спасибо за блог! Поржал! :) Заряд хорошего настроения получен :)
Подумай, программа использующая код
char *a = «Строка»;
String ^s = gcnew String(a);
Console::WriteLine(s);
запустится на компьютере с только что установленной Windows XP?
То есть на такой, на которой нет .NET Framework.
вместе с средой MSVC ставится
Зраствуйте Артём кашеваров ! Расскажу о себе мне 14 лет и я заинтересован в программирование вот подскажите пожалуйста какой язык лутше учить первым вот я выучил языки HTML & CSS
Теперь как изучить лутше язык php или delphi а потом уже С++
так лутше или ещё надо будет после php изучить javascript
Как легче будет подскажите пожалуйста Заранее спасибо?***
Лучше как раз php или delphi а потом уже С++ так легче =))
Так держать дружище =)
А хочу очень стать помощником вам помогать после изучение такое возможно правда я хочу стать программистом я уже чуть чуть знаю php и javascript но я ещё буду учить как вы подскажите ! ??
Написал тебе на мыло )
Здраствуйте артем кашеваров! Я бы хотел узнать с чего мне начать !с какого языка программирования подскажите пожалуйста я уже знаю языки html & css ??
Я всегда рекомендую Basic -> Pascal -> Delphi
Хотя первые 2 немного устарели, но для набивания руки — самое то!
Просто ваше мнение для меня лутше чем другое мнение потомучто вы программист и понимаете и вы проходили через всё это?
Артем, не путай праведное с грешным. Все что ты написал хорошо, но относится не к чистому С++, а к С++/CLR. Если ты нечто такое подсунешь например GCC, то ниче не выйдет, первый же String^ и gcnew коту под хвост. А тут надо сказать, что С++/CLR компилируется так же как и все остальные .NET языки в IL а не в машинный код, следовательно эффективность выполнения ниже, и оптимизация по скорости не так доступна, как для Native code, хотя по прежнему компилятор проглотит твою опцию -O2 и попытается изо всех сил оптимизировать выходной IL.