Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

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

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

30.09.2012, 03:14. Просмотров 1910. Ответов 11
Метки нет (Все метки)

Всем привет, собственно такая проблема..

Код:
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

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

printf/scanf - C++
Возник вопрос. int main(void) { printf(&quot;Hello world&quot;); } Что происходит здесь? Подключение в дебаге хедера &lt;stdio.h&gt; или...

Символы %ls и %lc в printf и scanf - C++
Здравствуйте. wchar_t c; wchar_t str; c = _getwch(); // считывает символ правильно. Проверял, коды совпадают c unicode: // а -...

printf scanf проги - C++
нужны проги со всеми возможными scanf и printf для практики, ничего кроме этого в проге не должно быть поидее язык си

Переделать на printf и scanf, пожалуйста! - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;time.h&gt; using namespace std; int main() { srand(time(NULL)); ...

Записать через printf и scanf - C++
Помогите переписать код через printf и scanf #include &lt;iostream&gt; #include &lt;cstdlib&gt; int mul( int a, int b ) { if( !b )...

Можете проверить scanf/printf - C++
Ответ неправильный, но я не понимаю в чем ошибка.. #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;iostream&gt; #include...

11
Triton.cpp
33 / 33 / 3
Регистрация: 14.04.2011
Сообщений: 103
30.09.2012, 11:04 #2
Попробуйте вместо
C++
1
setlocale(LC_ALL, ".OCP");
использовать
C++
1
setlocale(LC_ALL, ".866");
1
Issues
430 / 365 / 37
Регистрация: 06.08.2012
Сообщений: 961
30.09.2012, 11:09 #3
C++
1
setlocale(LC_ALL, "Rus")
0
Alexander.3
0 / 0 / 0
Регистрация: 04.09.2012
Сообщений: 13
30.09.2012, 15:07  [ТС] #4
Triton.cpp, в printf не отображает, в scanf нормально =( Как в первом варианте.
SeregaC++, в scanf не отображает, но в printf нормально, как во втором варианте.
0
Issues
430 / 365 / 37
Регистрация: 06.08.2012
Сообщений: 961
30.09.2012, 16:20 #5
Alexander.3, используйте cout и cin и всё будет работать.
0
Triton.cpp
33 / 33 / 3
Регистрация: 14.04.2011
Сообщений: 103
30.09.2012, 16:29 #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;
}
1
Alexander.3
0 / 0 / 0
Регистрация: 04.09.2012
Сообщений: 13
30.09.2012, 16:44  [ТС] #7
SeregaC++, слишком не понятно... вообще не понятно как это работает...
Triton.cpp, пробовал уже манипулировать с изменением кодировки по обстоятельству, проблема в том, что в последнем printf он выводит сообщение из scanf и массива... то есть сразу две кодировки О_о ( прикрепил скриншот )

Можно обойтись вообще без использования функции setlocale(): для этого необходимо сохранять файлы проекта в кодировке DOS 866.
Можно по подробнее? Я в этом не особо силен.. как сохранить так..?
0
Миниатюры
Конфликт кодировки между printf и scanf  
co6ak
Кошковед
409 / 502 / 29
Регистрация: 12.04.2010
Сообщений: 1,392
30.09.2012, 16:49 #8
это же виндовс. там нет конкретной кодировки
0
Triton.cpp
33 / 33 / 3
Регистрация: 14.04.2011
Сообщений: 103
30.09.2012, 16:58 #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]);
        //
    }
}
1
Triton.cpp
33 / 33 / 3
Регистрация: 14.04.2011
Сообщений: 103
30.09.2012, 17:05 #10
Цитата Сообщение от Alexander.3 Посмотреть сообщение
Можно по подробнее? Я в этом не особо силен.. как сохранить так..?
Конфликт кодировки между printf и scanfКонфликт кодировки между printf и scanf
1
Alexander.3
0 / 0 / 0
Регистрация: 04.09.2012
Сообщений: 13
30.09.2012, 17:11  [ТС] #11
Цитата Сообщение от Triton.cpp Посмотреть сообщение
Спасибо Вам большое. Все работает так, как я и хотел
0
Alexander.3
0 / 0 / 0
Регистрация: 04.09.2012
Сообщений: 13
30.09.2012, 17:34  [ТС] #12
Странно, возможно это уже не относится к данному топику, НО при проверки через scanf, условие не срабатывает, а если сделать MessageValidate("Вася", "Вася"), то работает отлично... как это возможно пофиксить?
MessageValidate("Вася", Name[0]) - тоже не работает.
0
Миниатюры
Конфликт кодировки между printf и scanf  
30.09.2012, 17:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.09.2012, 17:34
Привет! Вот еще темы с ответами:

printf,scanf, файлы borland - C++
Ребята может знает кто где можно почитать о printf,scanf в borland c++ и о работе с файлами . Устал насиловать гугл , про борланд...

Функции ввода/вывода printf(), scanf(). - C++
Составить программу для форматированного ввода и вывода данных заданного типа: Тип1=unsigned int; тип2= long int; тип3=float;...

Переделать scanf и printf в cin и cout - C++
#include &quot;stdio.h&quot; #include &quot;math.h&quot; int main() { float S=0; int n=3; printf(&quot;For\n&quot;); for (n=3; n &lt;= 9;...

scanf и printf или cin и cout - C++
Скажите пожалуйста,что предпочтительнее использовать на олимпиадах по программированию да и вообще : scanf и printf или cin и cout В...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru