На этом шаге мы приведем программы, реализующие указанные преобразования.
Фирма Microsoft ввела в C++ типы строк string и wstring. На самом деле - это синонимы класса basic_string, введенные через typedef.
Первый тип относится к классу, строки которого (как элементы класса) относятся к типу char, а второй тип - к классу, строки которого (как элементы класса) относятся к типу wchar_t.
В таблице 1 приведены операторы для работы со строками указанных типов.
Оператор | Назначение |
---|---|
+ | Сцепляет две строки |
!= | Проверяет, не равны ли две строки-операнда |
== | Проверяет, равны ли две строки-операнда |
< | Проверяет, меньше ли та строка, что находится слева от знака оператора, той строки, что находится справа от знака оператора |
<= | Проверяет, меньше или равна ли та строка, что слева от знака оператора, той строки, что справа от знака оператора |
<< | Вставляет строку в выходной поток (аналог cout при C++ вводе/выводе) |
> | Проверяет, больше ли та строка, что слева от знака оператора, той строки, что справа от знака оператора |
>= | Проверяет, больше или равна та строка, что слева от знака оператора, той строки, что справа от знака оператора |
>> | Извлекает строку из выходного потока (аналог сin при C++ вводе/выводе) |
swap | Если выполнить оператор swap (m1, m2);, то в m1 будет содержимое m2, а в m2 - содержимое m1 |
getline | Извлекает строку из входного потока |
c_str | Преобразует string-строку в С-строку |
Для работы со строками в программe нужно добавить конструкции:
#include <string>
using namespace std;
Пример программы, использующей конструкцию "!=", приведен ниже, а результат показан на рисунке 1.
// 221_1.cpp: главный файл проекта. #include "stdafx.h" #include <string> #include <conio.h> #include <iostream> using namespace System; using namespace std; void trueFalse(int x) { cout << (x? "True": "False") << endl; } void main() { string S1 = "ABC"; char CP1[] = "ABC"; char CP2[] = "DEF"; char CP3[] = "abc"; cout << "S1 is " << S1 << endl; cout << "CP1 is " << CP1 << endl; cout << "CP2 is " << CP2 << endl; cout << "CP3 is " << CP3 << endl; cout << "S1 != CP1 returned "; trueFalse(S1 != CP1); // False cout << "S1 != CP2 returned "; trueFalse(S1 != CP2); // True cout << "S1 != CP3 returned "; trueFalse(S1 != CP3); // True cout << "CP1 != S1 returned "; trueFalse(CP1 != S1); // False cout << "CP2 != S1 returned "; trueFalse(CP2 != S1); // True cout << "CP3 != S1 returned "; trueFalse(CP3 != S1); // True _getch(); }
Рис.1. Результат работы приложения
Строки string - это последовательности Юникод-символов.
Программа, использующая маршаллинг для преобразования строк типа String в строки типа string и wstring, приведена ниже, а результат ее работы показан на рисунке 2.
// 221_2.cpp: главный файл проекта. #include "stdafx.h" #include <string> // для string и wstring #include <conio.h> #include <iostream> // для C++ вывода using namespace System; //здесь находятся данные о типах string и wstring using namespace std; using namespace Runtime::InteropServices; // ==== функция копирует s в os типа string void MarshalString ( String^ s, string& os ) { // Маршал-метод копирует содержимое managed-строки // в неуправляемую память (кучу) и выдает указатель // типа void для его последующего преобразования // в необходимый тип // (в данном случае в const char*): const char* chars = (const char*)(Marshal::StringToHGlobalAnsi(s)).ToPointer(); // os - указатель на строку с символами char: os = chars; // освобождение памяти в неуправляемой куче, // которую занимает строка: Marshal::FreeHGlobal(IntPtr((void*)chars)); } // ==== функция копирует s в os типа wstring void MarshalString ( String^ s, wstring& os ) { // Маршал-метод копирует содержимое managed-строки // в неуправляемую память (кучу) и выдает указатель // типа void для его последующего преобразования в // необходимый тип // (в данном случае в const wchar_t*: const wchar_t* chars = (const wchar_t*)(Marshal::StringToHGlobalUni(s)).ToPointer(); os = chars; //теперь можно присвоить, т.к переменные одного типа // освобождение памяти в неуправляемой куче, // которую занимает строка: Marshal::FreeHGlobal(IntPtr((void*)chars)); } void main() { string a = "test"; wstring b = L"test2"; //"широкая" строка (по 2 байта на символ) String^ c = gcnew String("abcd"); cout << a << endl; //вывод строки а MarshalString(c, a); //перезапись с в а c = "efgh"; MarshalString(c, b); //перезапись с в b cout << a << endl; //вывод а wcout << b << endl; //вывод b _getch(); }
Рис.2. Результат работы со строками String, string и wstring
На следующем шаге мы рассмотрим преобразование string-строки в String-строку.