Ввод вывод русского текста в консольном приложении С++ Code::Bloks

Ввод вывод русского текста в консольном приложении С++ Code::Bloks

Пытаюсь изучать С++ и столкнулся с проблемой вывода введённого русского текста, если возможно помогите.

Только прошу помнить , что я ещё даже не чайник... Это из книги по С++.....

#include <iostream>
int main()
{
    setlocale( LC_ALL,"Russian" );
    using namespace std;
    const int ArSize = 20;
    char name[ArSize];
    char dessert[ArSize];

    cout << "Введите ваше имя:\n";
    cin.getline(name, ArSize);  // reads through newline
    cout << "Введите ваш любимый десерт:\n";
    cin.getline(dessert, ArSize);
    cout << "У меня есть некоторые вкусные " << dessert;
    cout << " для вас, " << name << ".\n";
    cin.get();
    return 0;
}

Это мне ничего не объяснило.......
Написание в самом тексте программы русского текста — это одна сторона медали.........

.....а вот вывод в моём примере из книги....где происходит предложение записи в самой консоли — cin.getline(name, ArSize);
cin.getline(dessert, ArSize);

а после этого вывод результата......вместо введённого текста на русском языке выводятся кракозябры......
Если возможно сам текст программы переделайте, чтобы после компиляции везде был текст выведен на русском языке.........
Заранее благодарен!!!!!!!!!!!!!!

ТС, проблема заключается в том, что вендовая консоль не умеет нормально работать с юникодом. Да и в общем-то, никак не умеет. Поэтому приходится использовать хаки с setlocale(), CharToOem() и т.п. Попробуйте воспользоваться методом, который предложил Иван — по ссылке из второго поста.

P.S. У меня все работает:

P.P.S. В ближайшем будущем советую задавать namespace по умолчанию в глобальном пространстве, чтобы избежать путаницы при работе с функциями.

#include <iostream>
using namespace std; // вот это лучше вынести из main() в global scope.

int main()
{
    setlocale(LC_ALL, "Russian");
    const int ArSize = 20;
    char name[ArSize];
    char dessert[ArSize];

    cout << "Введите ваше имя:\n";
    cin.getline(name, ArSize);  // reads through newline
    cout << "Введите ваш любимый десерт:\n";
    cin.getline(dessert, ArSize);
    cout << "У меня есть некоторые вкусные " << dessert;
    cout << " для вас, " << name << ".\n";
    cin.get();

    return 0;
}

А я решил проблему по-другому.

Я программирую в Dev C++ и не знаю, работает ли этот приём в других компиляторах.
Короче, все русские буквы при выводе на консоль шифруются шифром Цезаря, т.е. к их коду прибавляется определённое число (одно и то же), и результат выводится на экран.

А кроме того, оказалось, что компилятор сначала переводит буквы в отрицательный диапазон.
Вот прога, выводящая все символы в диапазоне от -255 до 0:

#include <stdio.h>
#include <iostream.h>

void main()
{
    for (int i=-255;i<=0;i++)
    {
        cout<<(char) i<<"-"<<i<<endl;
    };
}

Немного поколдовав над символами, я пришёл к такому выводу — к кодам строчных букв в диапазоне от «п» до «я» компилятор прибавляет 32, а ко всем остальным (включая и заглавные) 64. Исходя из результатов предыдущей программы я создал процедуру вывода русскоязычного текста:

#include <iostream.h>
#include <stdio.h>

void sout(char *pstr)
{
    int iruscode;
    for (int i=0;*(pstr+i);i++)
    {
        iruscode=(char)*(pstr+i);
        if (iruscode>-65&&iruscode<-16)
            iruscode-=64;
        if (iruscode<0&&iruscode>=-16)
            iruscode-=16;
        *(pstr+i)=(char)iruscode;
        printf("%c",*(pstr+i));
    };
}

Эта процедура работает с указателями и устаревшей функцией вывода printf, но я думаю,
не составит особого труда её переделать, кому захочется.

Сори ошибка

for(int i=0;*(pstr+i);i++);

и вот тут

iruscode=(char)*(pstr+i)

и здесь

*(pstr+i)=(char)iruscode;

Выделить часть текста между словами, которые вводятся с клавиатуры. В С++. кто может помочь? очень нужно

доброго времени суток, не мог-бы кто нибудь показать на примере, как сделать так чтобы введенный текст выводился нормально (по русски, а не по китайски)

#include <iostream>
#include <string>

using namespace std;

int main()
{
    setlocale(0, "");
    string name;
    cout << "как тебя звать ";
    cin >> name;
    cout << "тебя зовут " << name << endl;
    system ("pause");
    return 0;
}

Sergey, попробуй так

#include <iostream>
#include <string>
#include <windows.h>
using namespace std;

int main()
{
     setlocale(LC_ALL, "Russian");
     char N[100], N1[100];

     cout << "Введите ваше имя: " << endl;
     cin >> N;
     OemToCharBuff(N, N1, 100);

     cout << "Я приветствую Вас, " << N1 << "!" << endl;
     cin.get();
     system("pause") // Пишешь только для MSVS, Dev-C++ не поддерживает... =(
     return 0;
 }

Anri141801, с чего бы Dev-C++ под Виндой не поддерживать system("pause")? Очень даже поддерживает. А вот то, что в твоей программе эта строка не завершается точкой с запятой — твоя бага.

Для system() необходимо #include <cstdlib> или #include <stdlib.h>. MSVS этот хеадер включает типа «по умолчанию» через stdafx.h вроде.

Ещё в твоей программке хорошо бы число 100 объявить константой и в программе использовать символическое имя. Тогда, в случае необходимости изменения размера буфера, надо будет внести правку только в одном месте: в объявлении константы. А в твоём варианте надо внести правку в трёх местах, и, не дай Бог, ошибиться.

#include <iostream>
#include<stdlib.h>
#include <string>
#include <windows.h>
using namespace std;

int main()
{
setlocale(LC_ALL, "rus");

     char a[100], b[100];

     cout << "как тебя зовут?" << endl;
     cin >> a;
     OemToCharBuff(a, b, 100);

     cout << "Привет," << b << "!" << endl;
     cin.get();
}

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

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

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.