Как преобразовать string в string c
Перейти к содержимому

Как преобразовать string в string c

  • автор:

Практическое руководство. Преобразование между различными типами строк

В этой статье показано, как преобразовать различные типы строк Visual C++ в другие строки.

Типы строк, которые рассматриваются, включают char * , wchar_t* , _bstr_t , CComBSTR , CString и basic_string System.String.

Во всех случаях копия строки производится при преобразовании в новый тип. Любые изменения, внесенные в новую строку, не влияют на исходную строку, и наоборот.

Дополнительные сведения о преобразовании узких и широких строк см. в разделе «Преобразование между узкими строками и широкими строками».

Запуск примеров

Чтобы запустить примеры в Visual Studio 2022, можно создать консольное приложение C++. Или, если вы установили поддержку C++/CLI, можно создать консольное приложение CLR (платформа .NET Framework).

Если вы создаете консольное приложение CLR, вам не нужно вносить следующие изменения в параметры компилятора и отладчика. Однако вам потребуется добавить #include «pch.h» в верхнюю часть каждого примера.

В любом случае добавьте comsuppw.lib в свойства компоновщика >>проекта>дополнительные зависимости.

Если вы создадите консольное приложение C++ для запуска примеров, внесите следующие изменения в проект:

  • Добавьте аргументы командной /clr строки в /Zc:twoPhase- свойства>проекта C++>Command Line>Дополнительные параметры.

Параметр /clr конфликтует с некоторыми коммутаторами компилятора, заданными при создании проекта консольного приложения C++ Windows. Следующие ссылки содержат инструкции по тому, где в интегрированной среде разработки можно отключить конфликтующие коммутаторы:

  • Отключение (установка базовых проверок среды выполнения в значение по умолчанию): параметры проекта>C/C++>Code Generation>Basic Runtime Checks Default> /RTC1
  • /EHs Отключение (модель обработки исключений): свойства> проекта C/C++>Code Generation>enable C++ Exceptions No>
  • Exchange /Zi (формат сведений отладки) для /Z7 : совместимый с свойствами>проекта C/C++>General> Debug Information Format >C7
  • /JMC Отключить (только отладка кода): свойства> проекта C/C++>, общая> поддержка только для отладки кода>
  • Задайте для типа отладчика смешанный тип: Свойства отладчика>>проекта>смешанная (платформа .NET)
  • /ASSEMBLYDEBUG Включение: свойства>компоновщика> отладки отладочной сборки> >(ASSE МБ LYDEBUG)

Пример: преобразование из char *

Description

В этом примере показано, как преобразовать из char * строки в типы строк, перечисленные выше. Строка char * (также известная как строка в стиле C) использует завершающий значение NULL, чтобы указать конец строки. Строки в стиле C обычно требуют 1 байта на символ, но также могут использовать 2 байта. В приведенных ниже char * примерах строки иногда называются строками многобайтовых символов из-за данных строки, которые результаты преобразования из широкой строки Юникода. Однобайтовые и многобайтовые MBCS функции могут работать со char * строками.

Сведения о выполнении и отладке этого примера см. в разделе «Запуск примеров».

Код

// convert_from_char.cpp // compile with: /clr /Zc:twoPhase- /link comsuppw.lib #include #include #include #include "atlbase.h" #include "atlstr.h" #include "comutil.h" using namespace std; using namespace System; int main() < // Create and display a C-style string, and then use it // to create different kinds of strings. const char* orig = "Hello, World!"; cout // Convert the C-style string to a CStringA and display it. CStringA cstringa(orig); cstringa += " (CStringA)"; cout ", systemstring); delete systemstring; > 
Hello, World! (char *) Hello, World! (wchar_t *) Hello, World! (_bstr_t) Hello, World! (CComBSTR) Hello, World! (CStringA) Hello, World! (CStringW) Hello, World! (basic_string) Hello, World! (System::String) 

Пример: преобразование из wchar_t *

Description

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

Сведения о выполнении и отладке этого примера см. в разделе «Запуск примеров».

Код

// convert_from_wchar_t.cpp // compile with: /clr /Zc:twoPhase- /link comsuppw.lib #include #include #include #include "atlbase.h" #include "atlstr.h" #include "comutil.h" using namespace std; using namespace System; int main() < // Create a string of wide characters, display it, and then // use this string to create other types of strings. const wchar_t* orig = L"Hello, World!"; wcout // Convert a wide wchar_t string to a multibyte CStringA, // append the type of string to it, and display the result. CStringA cstringa(orig); cstringa += " (CStringA)"; cout ", systemstring); delete systemstring; > 
Hello, World! (wchar_t *) Hello, World! (char *) Hello, World! (_bstr_t) Hello, World! (CComBSTR) Hello, World! (CStringA) Hello, World! (CStringW) Hello, World! (basic_string) Hello, World! (System::String) 

Пример: преобразование из _bstr_t

Description

В этом примере показано, как преобразовать из другого _bstr_t типа строк. Объект _bstr_t инкапсулирует широкие строки символов BSTR . BSTR Строка имеет значение длины и не использует пустой символ для завершения строки, но для преобразования типа строки может потребоваться завершающий символ NULL.

Сведения о выполнении и отладке этого примера см. в разделе «Запуск примеров».

Код

// convert_from_bstr_t.cpp // compile with: /clr /Zc:twoPhase- /link comsuppw.lib #include #include #include #include "atlbase.h" #include "atlstr.h" #include "comutil.h" using namespace std; using namespace System; int main() < // Create a _bstr_t string, display the result, and indicate the // type of string that it is. _bstr_t orig("Hello, World!"); wcout // Convert a _bstr_t to a CStringA string. CStringA cstringa(orig.GetBSTR()); cstringa += " (CStringA)"; cout ", systemstring); delete systemstring; > 
Hello, World! (_bstr_t) Hello, World! (char *) Hello, World! (wchar_t *) Hello, World! (CComBSTR) Hello, World! (CStringA) Hello, World! (CStringW) Hello, World! (basic_string) Hello, World! (System::String) 

Пример: преобразование из CComBSTR

Description

В этом примере показано, как преобразовать из другого CComBSTR типа строк. Например _bstr_t , CComBSTR объект инкапсулирует широкие BSTR символьные строки. BSTR Строка имеет значение длины и не использует пустой символ для завершения строки, но тип строки, который вы преобразуете, может потребовать завершения null.

Сведения о выполнении и отладке этого примера см. в разделе «Запуск примеров».

Код

// convert_from_ccombstr.cpp // compile with: /clr /Zc:twoPhase- /link comsuppw.lib #include #include #include #include "atlbase.h" #include "atlstr.h" #include "comutil.h" #include "vcclr.h" using namespace std; using namespace System; using namespace System::Runtime::InteropServices; int main() < // Create and initialize a BSTR string by using a CComBSTR object. CComBSTR orig("Hello, World!"); // Convert the BSTR into a multibyte string, display the result, // and indicate the type of string that it is. CW2A printstr(orig); cout ", systemstring); delete systemstring; > 
Hello, World! (CComBSTR) Hello, World! (char *) Hello, World! (wchar_t *) Hello, World! (_bstr_t) Hello, World! (CStringA) Hello, World! (CStringW) Hello, World! (basic_string) Hello, World! (System::String) 

Пример: преобразование из CString

Description

В этом примере показано, как преобразовать из другого CString типа строк. CString основан на типе TCHAR данных, который, в свою очередь, зависит от того, определен ли символ _UNICODE . Если _UNICODE он не определен, TCHAR определяется char и CString содержит строку многобайтового символа; если _UNICODE она определена, TCHAR определена wchar_t и CString содержит широкую символьную строку.

CStringA содержит char тип и поддерживает однобайтовые или многобайтовые строки. CStringW — это версия широкого символа. CStringA и CStringW не используйте _UNICODE для определения того, как они должны компилироваться. CStringA и CStringW используются в этом примере для уточнения незначительных различий в выделении буфера и обработке выходных данных.

Сведения о выполнении и отладке этого примера см. в разделе «Запуск примеров».

Код

// convert_from_cstring.cpp // compile with: /clr /Zc:twoPhase- /link comsuppw.lib #include #include #include #include "atlbase.h" #include "atlstr.h" #include "comutil.h" using namespace std; using namespace System; int main() < // Set up a multibyte CStringA string. CStringA origa("Hello, World!"); cout // Convert to a wide character CComBSTR string from // a wide character CStringW string. CComBSTR ccombstrw(origw); // Append the type of string to it, and display the result. if (ccombstrw.Append(L" (CComBSTR)") == S_OK) < CW2A printstrw(ccombstrw); wcout // Convert a multibyte character CStringA to a // multibyte version of a basic_string string. string basicstring(origa); basicstring += " (basic_string)"; cout ", systemstring); delete systemstring; // Convert a wide character CStringW to a // System::String. String^ systemstringw = gcnew String(origw); systemstringw += " (System::String)"; Console::WriteLine("", systemstringw); delete systemstringw; > 
Hello, World! (CStringA) Hello, World! (CStringW) Hello, World! (char *) Hello, World! (char *) Hello, World! (wchar_t *) Hello, World! (wchar_t *) Hello, World! (_bstr_t) Hello, World! (_bstr_t) Hello, World! (CComBSTR) Hello, World! (CComBSTR) Hello, World! (basic_string) Hello, World! (System::String) 

Пример: преобразование из basic_string

Description

В этом примере показано, как преобразовать из другого basic_string типа строк.

Сведения о выполнении и отладке этого примера см. в разделе «Запуск примеров».

Код

// convert_from_basic_string.cpp // compile with: /clr /Zc:twoPhase- /link comsuppw.lib #include #include #include #include "atlbase.h" #include "atlstr.h" #include "comutil.h" using namespace std; using namespace System; int main() < // Set up a basic_string string. string orig("Hello, World!"); cout // Convert a basic_string string into a multibyte // CStringA string. CStringA cstring(orig.c_str()); cstring += " (CStringA)"; cout ", systemstring); delete systemstring; > 
Hello, World! (basic_string) Hello, World! (char *) Hello, World! (wchar_t *) Hello, World! (_bstr_t) Hello, World! (CComBSTR) Hello, World! (CStringA) Hello, World! (CStringW) Hello, World! (System::String) 

Пример: преобразование из System::String

Description

В этом примере показано, как преобразовать из широкой символьной системы::String в другие типы строк.

Сведения о выполнении и отладке этого примера см. в разделе «Запуск примеров».

Код

// convert_from_system_string.cpp // compile with: /clr /Zc:twoPhase- /link comsuppw.lib #include #include #include #include "atlbase.h" #include "atlstr.h" #include "comutil.h" #include "vcclr.h" using namespace std; using namespace System; using namespace System::Runtime::InteropServices; int main() < // Set up a System::String and display the result. String^ orig = gcnew String("Hello, World!"); Console::WriteLine("(System::String)", orig); // Obtain a pointer to the System::String in order to // first lock memory into place, so that the // Garbage Collector (GC) cannot move that object // while we call native functions. pin_ptr wch = PtrToStringChars(orig); // Make a copy of the System::String as a multibyte // char* string. Allocate two bytes in the multibyte // output string for every wide character in the input // string, including space for a terminating null. size_t origsize = wcslen(wch) + 1; const size_t newsize = origsize * 2; size_t convertedChars = 0; char* nstring = new char[newsize]; wcstombs_s(&convertedChars, nstring, newsize, wch, _TRUNCATE); cout // Convert a wide character System::String to // a multibyte CStringA string. CStringA cstring(wch); cstring += " (CStringA)"; cout 
Hello, World! (System::String) Hello, World! (char *) Hello, World! (wchar_t *) Hello, World! (_bstr_t) Hello, World! (CComBSTR) Hello, World! (CStringA) Hello, World! (CStringW) Hello, World! (basic_string) 

Преобразование между узкими и широкими строками

Устаревшие приложения C и Windows используют кодовые страницы, а не кодировки Юникода при обработке узких строк и широких строк.

Строки .NET являются UTF-16, но ATL CStringA является узкой строкой, и преобразование из широкого в узкий выполняется WideCharToMultiByte функцией Win32. При преобразовании стиля CHAR* C (стиль C CHAR* является .NET byte* ) в строку, которая вызывается противоположной функцией MultiByteToWideChar Win32.

Обе функции зависят от концепции Windows кодовой страницы; не концепция .NET языка и региональных параметров. Чтобы изменить системную кодовую страницу, используйте параметр региона с помощью панель управления> введите Region в поле поиска> регион (изменение даты, времени или числовых форматов)>Администратор строчного>языкового стандарта системы изменения.

В языковой версии Windows кодовая en-US страница по умолчанию — 1033. При установке другого языка Windows она будет иметь другую кодовую страницу. Его можно изменить с помощью панели управления.

Существует несоответствие в том, как CStringA выполняется широкое и узкое преобразование, и способ gcnew string(CHAR*) , который выполняет узкое к широкому преобразованию. CStringA передается CP_THREAD_ACP , что означает использование текущей кодовой страницы потока в метод сужения преобразования. Но string.ctor(sbyte*) передается CP_ACP , что означает использовать текущую системную кодовую страницу в метод расширения преобразования. Если системные и кодовые страницы потоков не совпадают, это может привести к повреждению данных кругового пути.

Чтобы примирить это различие, используйте константу _CONVERSION_DONT_USE_THREAD_LOCALE ), чтобы получить преобразование для использования CP_ACP (например, .NET) вместо CP_THREAD_ACP . Дополнительные сведения см. в разделе _CONVERSION_DONT_USE_THREAD_LOCALE .

Другой подход — использовать pinvoke для вызова GetThreadLocale . Используйте возвращаемый LCID объект для создания CultureInfo . Затем используйте CultureInfo.TextInfo для получения кодовой страницы, используемой в преобразовании.

Как преобразовывать в строки в языке C? [закрыт]

Закрыт. Этот вопрос необходимо уточнить или дополнить подробностями. Ответы на него в данный момент не принимаются.

Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение.

Закрыт 4 года назад .

Есть число: 123. Я хочу его сделать строчным, тип данных — String. «123». Можно ли как то это сделать?

Отслеживать
32.3k 15 15 золотых знаков 61 61 серебряный знак 93 93 бронзовых знака
задан 30 дек 2019 в 7:15
65 3 3 бронзовых знака
Откуда и по какой логике должна взяться цифра 3?
30 дек 2019 в 7:17
это 123, я не дописал
30 дек 2019 в 7:18
30 дек 2019 в 7:19

По первому же запросу в гугле вываливаетя масса иформации. Вопрос задан лишь для того чтобы задать вопрос?!

30 дек 2019 в 7:22
Кстати, типа данных String в языке C не существует
30 дек 2019 в 7:23

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Воспользоваться стандартной функцией

to_string(123) 

Если вы о C-строках — char[] — то тогда sprintf

Отслеживать
ответ дан 30 дек 2019 в 7:21
222k 15 15 золотых знаков 120 120 серебряных знаков 234 234 бронзовых знака

Типа string в Си нет. Самый оптимальный способ создать подобие строки — это создать массив символов, например:

char str[] = «Hello»;

Это эквивалент такой записи:

Вывести можно так printf(«%s\n», str);

for(int i = 0; str[i] != '\0'; i++) < printf("%c", str[i]); >printf("\n"); 

Как преобразовывать в строки в языке C? [закрыт]

Закрыт. Этот вопрос необходимо уточнить или дополнить подробностями. Ответы на него в данный момент не принимаются.

Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение.

Закрыт 4 года назад .

Есть число: 123. Я хочу его сделать строчным, тип данных — String. «123». Можно ли как то это сделать?

Отслеживать
32.3k 15 15 золотых знаков 61 61 серебряный знак 93 93 бронзовых знака
задан 30 дек 2019 в 7:15
65 3 3 бронзовых знака
Откуда и по какой логике должна взяться цифра 3?
30 дек 2019 в 7:17
это 123, я не дописал
30 дек 2019 в 7:18
30 дек 2019 в 7:19

По первому же запросу в гугле вываливаетя масса иформации. Вопрос задан лишь для того чтобы задать вопрос?!

30 дек 2019 в 7:22
Кстати, типа данных String в языке C не существует
30 дек 2019 в 7:23

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Воспользоваться стандартной функцией

to_string(123) 

Если вы о C-строках — char[] — то тогда sprintf

Отслеживать
ответ дан 30 дек 2019 в 7:21
222k 15 15 золотых знаков 120 120 серебряных знаков 234 234 бронзовых знака

Типа string в Си нет. Самый оптимальный способ создать подобие строки — это создать массив символов, например:

char str[] = «Hello»;

Это эквивалент такой записи:

Вывести можно так printf(«%s\n», str);

for(int i = 0; str[i] != '\0'; i++) < printf("%c", str[i]); >printf("\n"); 

Converting String to Cstring in C++

.c_str() returns a const char* . If you need a mutable version, you will need to produce a copy yourself.

answered Aug 6, 2012 at 1:10
Yann Ramin Yann Ramin
33.1k 3 3 gold badges 61 61 silver badges 83 83 bronze badges
.data() is just as good, and preferred for readability purposes.
Jul 21, 2014 at 5:13

In C++11, the functions .data() and .c_str() are synonymous, but in C++98 .data() returns a pointer that might not be terminated by a null character \0 . «There are no guarantees that a null character terminates the character sequence pointed by the value returned» by .data

Apr 27, 2016 at 5:11

vector toVector( const std::string& s ) < vectorv(s.size()+1); std::memcpy( &v.front(), s.c_str(), s.size() + 1 ); return v; > vector v = toVector("apple"); // what you were looking for (mutable) char* c = v.data(); 

.c_str() works for immutable. The vector will manage the memory for you.

3,348 25 25 silver badges 30 30 bronze badges
answered Aug 6, 2012 at 1:54
bytemaster bytemaster
602 3 3 silver badges 6 6 bronze badges

How can this bad code have so many upvotes without any comment pointing out that «s» is shadowed and hence no matter what’s give to the function it’ll always return apple? This code was obviously not tested.

May 9, 2022 at 4:02

string name; char *c_string; getline(cin, name); c_string = new char[name.length()]; for (int index = 0; index < name.length(); index++)< c_string[index] = name[index]; >c_string[name.length()] = '\0';//add the null terminator at the end of // the char array 

I know this is not the predefined method but thought it may be useful to someone nevertheless.

answered May 15, 2015 at 13:18
Ritchie Shatter Ritchie Shatter
195 1 1 gold badge 5 5 silver badges 14 14 bronze badges
c_string is one byte too short if you want to add a 0 terminator like this
Feb 9, 2018 at 8:42

You can do it by 2 steps.

  1. convert string -> const char*
  2. const char* -> CString
string st = "my str"; const char* stBuf = st.c_str(); // 1. string to const char * size_t sz; // save converted string's length + 1 wchar_t output[50] = L""; // return data, result is CString data mbstowcs_s(&sz, output, 50, stBuf, 50); // converting function CString cst = output; 

answered Feb 27, 2022 at 10:28
131 6 6 bronze badges

Plain and simple:

size_t copyString2CString(char* cstr, const std::string& str, const size_t maxSize) < const char* data = str.c_str(); size_t copySize = str.size(); if (maxSize == 0) return maxSize; // Honestly? if (!cstr) return 0; // Honestly. // Mind your termination character if (copySize + 1 >maxSize) copySize = maxSize - 1; memcpy(cstr, data, copySize); cstr[copySize] = '\0'; // Again: Mind your termination character return copySize; > 

Copies content of str to cstr taking care of the termination character. You should provide the maximum size of cstr via parameter maxSize .

Do not forget to #include . Merry copying!

answered Aug 10, 2023 at 7:37
ardillapaga ardillapaga
3 3 3 bronze badges
Surely, the srd:strdup() function is even simpler: char* cstr = std:strdup(str.c_str()); . Is not?
Aug 12, 2023 at 11:38

Yes, it’s definitely simpler! But you should be aware of the fact that the memory cstr is pointing to was allocated dynamically. So, give free(cstr) a quick call once you’re done. The advantage of my definition above is that there should not be any undefined behaviour (like with strcpy )and that you can control the define the destination memory the source string should be copied to.

Добавить комментарий

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