MS VC++ для начинающих

Ответить
Аватара пользователя
blackstrip
Админ
Сообщения: 967
Зарегистрирован: Ср янв 02, 2008 1:42 pm
Откуда: Подольск
Контактная информация:

MS VC++ для начинающих

Сообщение blackstrip » Ср июл 16, 2014 12:28 am

Решил на днях вчитаться в учебник по C++, а хоть синтаксис у этого си знакомый, но это совсем не ява, не сишарп. Самое трудное - понять массу обозначений разными значками, а то в других языках программирования все в основном в виде процедур/функций делается.

Начал с изучения консольных приложений под Win32 и захотелось выводить русские буквы, а для этого надо выводить буквы в дос-кодировке. Прошарив несколько сайтов, нашел решение, чуть-чуть дописал его. Может кто будет тоже искать - тогда вот оно:

Вывод русских букв в консоли С++

Код: Выделить всё

#include <iostream>
#include <windows.h> //отсюда будем использовать функцию конвертации win-текста в дос-текст
using std::cout; //это чтоб быстро обращаться к потоку вывода текста в консоль без всяких std
using std::endl; //а это чтоб быстро обращаться к символу конца строки, который также можно в виде \n писать

char buf[256]; //создаем на старте буфер 256 символов, и пусть он валяется в памяти до конца работы программы

char* dostext( char* str ) //функция - на входе указатель на массив букв в win-кодировке
 {
	CharToOemA( str, buf ); //вызываем из windows.h функцию перекодирования, результат будет валяться в нашем buf
	return buf; //возвращаем указатель на buf
 }

int main() //главный кусь программы
{
	cout << dostext("Привет") << endl; //выводим в поток вывода "Привет" в дос-кодировке
	cout << dostext("Медвед") << endl; //выводим в поток вывода "Медвед" в дос-кодировке
	return 0;
}
Одно из преимуществ CharToOemA - не надо выключать unicode в свойствах конфигурации проекта (в отличии от рекомендуемого везде CharToOem).

Одна есть проблема: cout << dostext("Привет") << dostext("Медвед") << endl; выводит дважды "Привет", хотя по отладчику видно что буфер перезаписывается второй раз на новое значение. Видимо это какие-то замуты с выводом в поток cout.

Аватара пользователя
blackstrip
Админ
Сообщения: 967
Зарегистрирован: Ср янв 02, 2008 1:42 pm
Откуда: Подольск
Контактная информация:

Re: MS VC++ для начинающих

Сообщение blackstrip » Пт июл 18, 2014 2:05 am

Если добавить в заголовок программы:
#include <string>
using std::string;


То можно вместо char* использовать тип string (точнее std::string). И тогда можно написать что нибудь такое:
string s = dostext("хеллоу");
cout << s << endl;


При этом строка типа string будет походу автоматом конвертироваться в char*.

А вообще сишный компилятор делает вещи, похожие на ассемблерное использованию строк. Когда пишем в программе строку в кавычках, то компилятор превращает ее в строку символов, добавляя в конец нулевой символ. Поэтому такая строка всегда будет null-terminated (заканчивающаяся нулевым символом). И получается что четырехбуквенная строка "вася" в памяти превратится в массив из 5 символов: "В", "А", "С", "Я", нулевой символ. Поэтому строки могут быть по идее любой длины, а чтоб посчитать длину строки - можно всего лишь пробежаться по массиву, считая символы, пока не встретишь нулевой символ.

Хотя все эти процедуры (длина строки и т.д.) есть уже в готовом виде в модуле string.

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость