Форум программистов, компьютерный форум CyberForum.ru

Конфликт кодировки между printf и scanf - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.62
Alexander.3
0 / 0 / 0
Регистрация: 04.09.2012
Сообщений: 13
30.09.2012, 03:14     Конфликт кодировки между printf и scanf #1
Всем привет, собственно такая проблема..

Код:
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
#include <stdio.h>
#include <conio.h>
#include <locale.h>
 
void main() {
    setlocale(LC_ALL, "Russian");       // Вариант первый
    //setlocale(LC_ALL, ".OCP");        // Вариант второй
    char Name[5][100] = {
        "Тест сообщения",
        "Тест сообщения 2",
        "Тест сообщения 3",
        "Тест сообщения 4",
        "Тест сообщения 5"
    };
 
    printf("%s\n%s\n%s\n%s\n%s\n", Name[0], Name[1], Name[2], Name[3], Name[4]);
 
    char ch[100];
 
    while(1) {
        scanf("%s", &ch);       
        printf("%s || %s \n", ch, Name[0]);
    }
}
Первый вариант ( Используем setlocale(LC_ALL, "Russian"); ) правильно отображает сообщение в printf
Второй вариант ( Используем setlocale(LC_ALL, ".OCP"); ) правильно отображает сообщения с scanf, но уже не отображает printf

Смотрим вложения. Как это возможно исправить?
Миниатюры
Конфликт кодировки между printf и scanf   Конфликт кодировки между printf и scanf  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.09.2012, 03:14     Конфликт кодировки между printf и scanf
Посмотрите здесь:

C++ Функции ввода/вывода printf(), scanf().
C++ printf scanf проги
C++ printf/scanf
C++ Можете проверить scanf/printf
C++ printf,scanf, файлы borland
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Triton.cpp
 Аватар для Triton.cpp
33 / 33 / 3
Регистрация: 14.04.2011
Сообщений: 103
30.09.2012, 11:04     Конфликт кодировки между printf и scanf #2
Попробуйте вместо
C++
1
setlocale(LC_ALL, ".OCP");
использовать
C++
1
setlocale(LC_ALL, ".866");
Issues
429 / 364 / 37
Регистрация: 06.08.2012
Сообщений: 961
30.09.2012, 11:09     Конфликт кодировки между printf и scanf #3
C++
1
setlocale(LC_ALL, "Rus")
Alexander.3
0 / 0 / 0
Регистрация: 04.09.2012
Сообщений: 13
30.09.2012, 15:07  [ТС]     Конфликт кодировки между printf и scanf #4
Triton.cpp, в printf не отображает, в scanf нормально =( Как в первом варианте.
SeregaC++, в scanf не отображает, но в printf нормально, как во втором варианте.
Issues
429 / 364 / 37
Регистрация: 06.08.2012
Сообщений: 961
30.09.2012, 16:20     Конфликт кодировки между printf и scanf #5
Alexander.3, используйте cout и cin и всё будет работать.
Triton.cpp
 Аватар для Triton.cpp
33 / 33 / 3
Регистрация: 14.04.2011
Сообщений: 103
30.09.2012, 16:29     Конфликт кодировки между printf и scanf #6
Проблема заключается в том, что используются различные кодировки в сиситеме программирования (1251) и в консольном приложении (866).

Можно обойтись вообще без использования функции setlocale(): для этого необходимо сохранять файлы проекта в кодировке DOS 866.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//VS2010
// Этот файл нужно сохранить в кодировке DOS 866
#include <cstdio>
#include <cstdlib>
 
int main() {
   
    printf("%s\n%s\n", "Консольное приложение имеет кодировку 866", "Введите строку: ");
    
    char str[20];
    scanf("%s", &str); 
    
    printf("%s\n", str);
    
    system("pause");
    return 0;
}
Если нет желания заморачиваться с сохранением исходного кода в кодировке 866, то можно поступить так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//VS2010
#include <cstdio>
#include <cstdlib>
#include <clocale>
 
int main() {
    setlocale(LC_ALL, ".1251");
    printf("%s\n%s\n", "Консольное приложение имеет кодировку 866", "Введите строку: ");
    
    char str[20];
    scanf("%s", &str); 
    
    setlocale(LC_ALL, ".866");
    printf("%s\n", str);
    
    system("pause");
    return 0;
}
Alexander.3
0 / 0 / 0
Регистрация: 04.09.2012
Сообщений: 13
30.09.2012, 16:44  [ТС]     Конфликт кодировки между printf и scanf #7
SeregaC++, слишком не понятно... вообще не понятно как это работает...
Triton.cpp, пробовал уже манипулировать с изменением кодировки по обстоятельству, проблема в том, что в последнем printf он выводит сообщение из scanf и массива... то есть сразу две кодировки О_о ( прикрепил скриншот )

Можно обойтись вообще без использования функции setlocale(): для этого необходимо сохранять файлы проекта в кодировке DOS 866.
Можно по подробнее? Я в этом не особо силен.. как сохранить так..?
Миниатюры
Конфликт кодировки между printf и scanf  
co6ak
Кошковед
 Аватар для co6ak
402 / 495 / 29
Регистрация: 12.04.2010
Сообщений: 1,392
30.09.2012, 16:49     Конфликт кодировки между printf и scanf #8
это же виндовс. там нет конкретной кодировки
Triton.cpp
 Аватар для Triton.cpp
33 / 33 / 3
Регистрация: 14.04.2011
Сообщений: 103
30.09.2012, 16:58     Конфликт кодировки между printf и scanf #9
Цитата Сообщение от Alexander.3 Посмотреть сообщение
Triton.cpp, пробовал уже манипулировать с изменением кодировки по обстоятельству, проблема в том, что в последнем printf он выводит сообщение из scanf и массива... то есть сразу две кодировки О_о ( прикрепил скриншот )
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
#include <stdio.h>
#include <conio.h>
#include <locale.h>
 
void main() {
    setlocale(LC_ALL, ".1251");       // Вариант первый
    //setlocale(LC_ALL, ".OCP");        // Вариант второй
    char Name[5][100] = {
        "Тест сообщения",
        "Тест сообщения 2",
        "Тест сообщения 3",
        "Тест сообщения 4",
        "Тест сообщения 5"
    };
 
    printf("%s\n%s\n%s\n%s\n%s\n", Name[0], Name[1], Name[2], Name[3], Name[4]);
 
    char ch[100];
 
    while(1) {
        scanf("%s", &ch); 
        setlocale(LC_ALL, ".866");      printf("%s || ", ch);
        setlocale(LC_ALL, ".1251");     printf("%s\n", Name[0]);
        //
    }
}
Triton.cpp
 Аватар для Triton.cpp
33 / 33 / 3
Регистрация: 14.04.2011
Сообщений: 103
30.09.2012, 17:05     Конфликт кодировки между printf и scanf #10
Цитата Сообщение от Alexander.3 Посмотреть сообщение
Можно по подробнее? Я в этом не особо силен.. как сохранить так..?
Конфликт кодировки между printf и scanfКонфликт кодировки между printf и scanf
Alexander.3
0 / 0 / 0
Регистрация: 04.09.2012
Сообщений: 13
30.09.2012, 17:11  [ТС]     Конфликт кодировки между printf и scanf #11
Цитата Сообщение от Triton.cpp Посмотреть сообщение
Спасибо Вам большое. Все работает так, как я и хотел
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.09.2012, 17:34     Конфликт кодировки между printf и scanf
Еще ссылки по теме:

C++ Записать через printf и scanf
Ввод/вывод через printf() и scanf() C++
Символы %ls и %lc в printf и scanf C++

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

Или воспользуйтесь поиском по форуму:
Alexander.3
0 / 0 / 0
Регистрация: 04.09.2012
Сообщений: 13
30.09.2012, 17:34  [ТС]     Конфликт кодировки между printf и scanf #12
Странно, возможно это уже не относится к данному топику, НО при проверки через scanf, условие не срабатывает, а если сделать MessageValidate("Вася", "Вася"), то работает отлично... как это возможно пофиксить?
MessageValidate("Вася", Name[0]) - тоже не работает.
Миниатюры
Конфликт кодировки между printf и scanf  
Yandex
Объявления
30.09.2012, 17:34     Конфликт кодировки между printf и scanf
Ответ Создать тему
Опции темы

Текущее время: 13:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru