Шаг 221.
Microsoft Visual C++ 2010. Язык С/С++. Преобразование между регулируемыми и нерегулируемыми... . Пример 10. Преобразование String-строки в string-строку

    На этом шаге мы приведем программы, реализующие указанные преобразования.

    Фирма Microsoft ввела в C++ типы строк string и wstring. На самом деле - это синонимы класса basic_string, введенные через typedef.

    Первый тип относится к классу, строки которого (как элементы класса) относятся к типу char, а второй тип - к классу, строки которого (как элементы класса) относятся к типу wchar_t.

    В таблице 1 приведены операторы для работы со строками указанных типов.

Таблица 1. Операторы для работы со строками типов string и wstring
Оператор Назначение
+ Сцепляет две строки
!= Проверяет, не равны ли две строки-операнда
== Проверяет, равны ли две строки-операнда
< Проверяет, меньше ли та строка, что находится слева от знака оператора, той строки, что находится справа от знака оператора
<= Проверяет, меньше или равна ли та строка, что слева от знака оператора, той строки, что справа от знака оператора
<< Вставляет строку в выходной поток (аналог 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-строку.




Предыдущий шаг Содержание Следующий шаг