Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
1 / 1 / 0
Регистрация: 11.11.2016
Сообщений: 104
1

Русификация сбита в системно независимом файле MVS

11.11.2016, 19:43. Показов 830. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Создавал системно независимый exe-файл, все хорошо вышло. Нужно было написать программу,которая удаляет повторяющиеся слова и выводит эти слова и их повторения. Преподаватель сказал что все написано хорошо, но когда он смотрел на своем нерабочем ноутбуке этот системно независимый файл,то все работало,но русификация сбита. Т.к. нужно иметь ввиду. что он мог ввести в прогонах русские символы, то использовал SetConsole в качестве русификатора,но почему то все сбилось,помогите.
Вот код.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include "stdafx.h"
#include <iostream>
#include <string>
#include <cmath>
#include <Windows.h>
#include <clocale>
 
using namespace std;
 
int main()
{
string Str, word;
int len, len1;
int i = 0, first = 0, last, rep = 0, count = 0, j;
setlocale(LC_CTYPE, "RUSSIAN");
SetConsoleCP(1251);//установка кодовой страницы win-cp 1251 в поток ввода
SetConsoleOutputCP(1251);//установка кодовой страницы win-cp 1251 в поток вывода
cout << " ВАС ПРИВЕТСТВУЕТ ПРОГРАММА ПО ОБРАБОТКЕ СТРОКОВЫХ ДАННЫХ!" << endl;
while (1)
{ // контроль входных данных
cout << " Введите строку (не более 200 символов): " << endl;
getline(cin, Str);
len = Str.length();
if (len < 200) break;
}
while (1) //ищем пробел для того, чтобы взять слово для поиска
{
while (i < len)
{
if (Str[i] == ' ') break;
else
{
i++;
}
}
j = i;
last = i;
word = Str.substr(first, last - first);
len1 = word.length();
rep = Str.find(word, last);
while (i<len) //поиск повторов слова
{
if (rep>0)
{
Str.erase(rep, len1 + 1); //удаление повторяющегося слова из строки
count++;
rep = Str.find(word, rep); //индекс местоположения повторяющегося слова
} //-1 - признак отсутствия повторов
else break;
}
if (count != 0) // вывод повторяющихся слов и удаление первого слова
{
cout << "Cлово " << word << " повторяется " << count + 1 << " раз(а)" << endl;
Str.erase(first, len1 + 1);
first = j - len1;
j = j - len1;
}
else first = j + 1;
count = 0; //инициализация переменных для поиска
word = ""; //новых повторяющихся слов в строке
len = Str.length();
 
if (j<len)
{
i = j + 1;
}
if (j + 1 >= len) break;
}
cout << "Получившаяся строка: " << Str << endl;
system("Pause");
return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.11.2016, 19:43
Ответы с готовыми решениями:

Русификация (перевод слов) столбцов в текстовом файле
Привет.В текстовом файле 4 столбца написанные на английском языке,под ними какие-то значения....

Системно-независимый таймер
Нужно реализовать системно независимый таймер на паскале под ДОС, который одинаково работал бы на...

При включении ПК, на системно блоке засвечивается только кнопка Power, а загрузки нет.
Здравствуйте. Такая проблема, иногда при включении ПК, на системно блоке засвечивается только...

Std::thread. Нет ожидаемого поведения при независимом вычислении элементов вектора
Хочу распараллелить вычисления отдельных элементов массива: каждый - в своём потоке. #include...

21
7794 / 6560 / 2985
Регистрация: 14.04.2014
Сообщений: 28,681
11.11.2016, 19:51 2
setlocale() убери, если переключаешь на 1251. И Шрифт в консоли должен быть Lucida Console.
0
1 / 1 / 0
Регистрация: 11.11.2016
Сообщений: 104
11.11.2016, 20:11  [ТС] 3
Не помогает, убрал библиотеку clocale, убрал setlocale, поменял шрифт на Consoles, но все равно на независимом компе файл запускается,но пишет фигню,но если менять шрифт на другом компе, то все хорошо, но надо чтобы без этого было
0
7794 / 6560 / 2985
Регистрация: 14.04.2014
Сообщений: 28,681
11.11.2016, 20:13 4
На каком независимом? Там тоже надо шрифт менять.
Цитата Сообщение от Skier97 Посмотреть сообщение
надо чтобы без этого было
Тогда CharToOemA() и OemToCharA() для тебя.
0
1 / 1 / 0
Регистрация: 11.11.2016
Сообщений: 104
11.11.2016, 20:21  [ТС] 5
CharToOemA() и OemToCharA() это где писать? Надо библиотеку подключать?
Системно независимый exe файл, там я менял шрифт, а на другом компе этот же файл не отображает
0
7794 / 6560 / 2985
Регистрация: 14.04.2014
Сообщений: 28,681
11.11.2016, 21:30 6
Что значит системнонезависимый? Если exe, то уже зависимый. Эти функции есть во всех версиях Windows.
Перед выводом строки перекодируешь CharToOemA(), после ввода строки, перед использованием - OemToCharA().
C++
1
2
3
char msg[] = " ВАС ПРИВЕТСТВУЕТ ПРОГРАММА ПО ОБРАБОТКЕ СТРОКОВЫХ ДАННЫХ!";
CharToOemA(msg, msg);
cout << msg << endl;
0
1 / 1 / 0
Регистрация: 11.11.2016
Сообщений: 104
11.11.2016, 21:39  [ТС] 7
Системно независимый - значит exe запускается на любом компе, независимо от того, есть ли на нем MVS и тд или нет

Добавлено через 5 минут
msg - тип char ведь? Как перевести тогда его в тип string?Мне для дальнейшей работы нужен string
0
7794 / 6560 / 2985
Регистрация: 14.04.2014
Сообщений: 28,681
11.11.2016, 21:42 8
Visual C++ Redistributable всё равно придётся установить.

Добавлено через 1 минуту
C++
1
2
3
4
5
char buf[1000];
cin.getline(buf, 1000);
OemToCharA(buf, buf);
Str = buf;
len = Str.length();
0
1 / 1 / 0
Регистрация: 11.11.2016
Сообщений: 104
11.11.2016, 21:42  [ТС] 9
а это другая версия студии или что?
0
7794 / 6560 / 2985
Регистрация: 14.04.2014
Сообщений: 28,681
11.11.2016, 21:44 10
Нет, это dll-библиотеки для C++.
0
1 / 1 / 0
Регистрация: 11.11.2016
Сообщений: 104
11.11.2016, 21:44  [ТС] 11
Так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int  len, len1;
    int i = 0, first = 0, last, rep = 0, count = 0, j;
    
    SetConsoleCP(1251);//установка кодовой страницы win-cp 1251 в поток ввода
    SetConsoleOutputCP(1251);//установка кодовой страницы win-cp 1251 в поток вывода
    cout << "    ВАС ПРИВЕТСТВУЕТ ПРОГРАММА ПО ОБРАБОТКЕ СТРОКОВЫХ ДАННЫХ!" << endl;
        char msg[] = " ВАС ПРИВЕТСТВУЕТ ПРОГРАММА ПО ОБРАБОТКЕ СТРОКОВЫХ ДАННЫХ!";
    
    while (1)
    {                                     // контроль входных данных
        cout << " Введите строку (не более 200 символов): " << endl;
        char buf[1000];
        cin.getline(buf, 1000);
        OemToCharA(buf, buf);
        Str = buf;
        len = Str.length();
0
7794 / 6560 / 2985
Регистрация: 14.04.2014
Сообщений: 28,681
11.11.2016, 21:47 12
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int len, len1;
int i = 0, first = 0, last, rep = 0, count = 0, j;
 
char msg[] = " ВАС ПРИВЕТСТВУЕТ ПРОГРАММА ПО ОБРАБОТКЕ СТРОКОВЫХ ДАННЫХ!";
CharToOemA(msg, msg);
cout << msg << endl;
 
char msg1[] = " Введите строку (не более 200 символов): ";
CharToOemA(msg1, msg1);
while (1)
{ 
cout << msg1 << endl;
char buf[1000];
cin.getline(buf, 1000);
OemToCharA(buf, buf);
Str = buf;
len = Str.length();
0
1 / 1 / 0
Регистрация: 11.11.2016
Сообщений: 104
11.11.2016, 21:55  [ТС] 13
т.е. в любом случае работать не будет?Если не установлю библиотеки

Добавлено через 2 минуты
Т.е. мне везде надо подправить где происходит вывод текста?

Добавлено через 4 минуты
а как поступить с этим фрагментом?
C++
1
2
3
4
5
6
7
if (count != 0)                     // вывод повторяющихся слов и удаление первого слова
        {
            cout << "Cлово  " << word << " повторяется " << count + 1 << " раз(а)" << endl;
            Str.erase(first, len1 + 1);
            first = j - len1;
            j = j - len1;
        }
0
7794 / 6560 / 2985
Регистрация: 14.04.2014
Сообщений: 28,681
11.11.2016, 21:58 14
Цитата Сообщение от Skier97 Посмотреть сообщение
т.е. в любом случае работать не будет?Если не установлю библиотеки
Может и будет, если их уже установили с Visual Studio или с другим ПО.
Цитата Сообщение от Skier97 Посмотреть сообщение
Т.е. мне везде надо подправить где происходит вывод текста?
Да.
Есть ещё вариант с wcin/wcout и wstring. Там без перекодирования работает.

Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main()
{
wstring Str, word;
int len, len1;
int i = 0, first = 0, last, rep = 0, count = 0, j;
 
wcout.imbue(locale("rus_RUS.866"));
wcin.imbue(locale("rus_RUS.866"));
 
wcout << L" ВАС ПРИВЕТСТВУЕТ ПРОГРАММА ПО ОБРАБОТКЕ СТРОКОВЫХ ДАННЫХ!" << endl;
while (1)
{ // контроль входных данных
wcout << L" Введите строку (не более 200 символов): " << endl;
getline(wcin, Str);
len = Str.length();
0
1 / 1 / 0
Регистрация: 11.11.2016
Сообщений: 104
11.11.2016, 21:59  [ТС] 15
а как этот вариант будет работать в моем случае?
0
sourcerer
11.11.2016, 22:02
  #16
 Комментарий модератора 
Skier97, прочитайте правила форума.
Особое внимание обратите на пункт 4.9 (порядок оформления кода).
0
7794 / 6560 / 2985
Регистрация: 14.04.2014
Сообщений: 28,681
11.11.2016, 22:07 17
Цитата Сообщение от Skier97 Посмотреть сообщение
как этот вариант будет работать в моем случае?
Ну мой пример смотри. Минимум изменений.
0
1 / 1 / 0
Регистрация: 11.11.2016
Сообщений: 104
11.11.2016, 22:12  [ТС] 18
А как сделать здесь мне с помощью того же метода?
C++
1
2
3
4
5
6
7
if (count != 0)                     // вывод повторяющихся слов и удаление первого слова
        {
            cout << "Cлово  " << word << " повторяется " << count + 1 << " раз(а)" << endl;
            Str.erase(first, len1 + 1);
            first = j - len1;
            j = j - len1;
        }
0
7794 / 6560 / 2985
Регистрация: 14.04.2014
Сообщений: 28,681
11.11.2016, 22:15 19
С перекодированием надо формировать строку-результат в массиве char и перекодировать, а с wcout просто добавишь L перед открывающими кавычками.

Добавлено через 51 секунду
Пробуй wcin/wcout.
0
1 / 1 / 0
Регистрация: 11.11.2016
Сообщений: 104
11.11.2016, 22:19  [ТС] 20
Спасибо большое!Я все сделал и разобрался!
0
11.11.2016, 22:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.11.2016, 22:19
Помогаю со студенческими работами здесь

MVS 10 vs QT
Мне хотелось бы узнать что лучше QT или Microsoft Visual Stidio 2010. Учусь программировать на...

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

Русификация в с++
Всем привет, у меня есть код, в результате выполнения которого я могу написать какое-либо...

Компиляция в mvs
Приветствую всех. У меня установлен Microsoft Visual Studio 2015. Как скомпилировать C++...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru