Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/40: Рейтинг темы: голосов - 40, средняя оценка - 4.55
15 / 15 / 8
Регистрация: 15.08.2013
Сообщений: 190
1

Функция strlen() на русской раскладке считает один символ за 2

10.05.2016, 14:45. Показов 7399. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Объясните пожалуйста почему функция "strlen()" считает очень странным образом
пишешь Английскими буквами считает правильно, перехожу на Русский считает один символ за 2 почему это так?


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <cstring>
#include <cstdio>
 
using namespace std;
 
int main()
 
{
char str[80];
cout << "Введите строку: ";
cin >> str;
cout << "Длина вашей строки: " << strlen (str);
return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.05.2016, 14:45
Ответы с готовыми решениями:

Назначить # вместо № в русской раскладке
Здравствуйте. Часто приходится печатать символ # в режиме русской раскладки. Приходится каждый раз...

keyPressEvent() при русской раскладке
Как сделать, чтобы keyPressEvent() обрабатывал нажатие клавиши при русской раскладке?

Горячие клавиши в русской раскладке
В англ раскладке, горячие клавиши отрабатывают, а с русской не хотят. Чтобы что-то скопировать...

Имитация нажатия клавиш в русской раскладке
Здравствуйте! Требуется имитировать нажатие клавиши ю( в русской раскладке). ...

15
156 / 143 / 62
Регистрация: 08.09.2014
Сообщений: 1,220
10.05.2016, 14:53 2
Строку в студию и результат
1
15 / 15 / 8
Регистрация: 15.08.2013
Сообщений: 190
10.05.2016, 15:00  [ТС] 3
Игорь1986,
Миниатюры
Функция strlen() на русской раскладке считает один символ за 2  
0
58 / 55 / 28
Регистрация: 20.05.2015
Сообщений: 256
10.05.2016, 15:02 4
MRG_Serejka, По стандарту C++ всё работает нормально, у меня ваша программа работает; скорее всего дело в вашей среде программирования, которая, возможно, русский алфавит считает в кодировке Unicode, а английский по дефолту есть практически в любой, но вероятность этого мала.
1
156 / 143 / 62
Регистрация: 08.09.2014
Сообщений: 1,220
10.05.2016, 15:02 5
А строку обнулять кто будет, или ты думал она сама по себе очиститься, просто такое ощущение что результат накапливается для этого введите русскую строку больше по длине и посмотрите, а потом попробую обнулить строку после вывода результата
C++
1
char str[80]={0};
1
15 / 15 / 8
Регистрация: 15.08.2013
Сообщений: 190
10.05.2016, 15:06  [ТС] 6
Игорь1986, не очень понял что вы хотели этим сказать.
0
156 / 143 / 62
Регистрация: 08.09.2014
Сообщений: 1,220
10.05.2016, 15:15 7
Запиши инициализацию строки как я написал и проверь
1
15 / 15 / 8
Регистрация: 15.08.2013
Сообщений: 190
10.05.2016, 15:17  [ТС] 8
Игорь1986, редактировал код результат такой же...
Миниатюры
Функция strlen() на русской раскладке считает один символ за 2  
0
58 / 55 / 28
Регистрация: 20.05.2015
Сообщений: 256
10.05.2016, 15:21 9
MRG_Serejka, sudo apt-get install codeblocks в терминале и там проверьте, создав новый проект.
1
156 / 143 / 62
Регистрация: 08.09.2014
Сообщений: 1,220
10.05.2016, 15:22 10
Ну тогда попробуй еще так после вывода запиши строку, если и так не прокатит то ждем спецов ubuntu
C++
1
str[0]=' ';
1
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
10.05.2016, 15:36 11
strlen считает количество байт до первого нуля.
https://ru.wikipedia.org/wiki/UTF-8
1
Вездепух
Эксперт CЭксперт С++
11695 / 6374 / 1724
Регистрация: 18.10.2014
Сообщений: 16,068
10.05.2016, 19:04 12
Цитата Сообщение от Игорь1986 Посмотреть сообщение
А строку обнулять кто будет, или ты думал она сама по себе очиститься,
При чтении строки из istream при помощи оператора >>, прочитанная строка будет завершена нулевым символом. Поэтому ничего тут заранее обнулять не надо.
1
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
10.05.2016, 19:50 13
MRG_Serejka,
Цитата Сообщение от Melvil Посмотреть сообщение
По стандарту C++ всё работает нормально, у меня ваша программа работает; скорее всего дело в вашей среде программирования, которая, возможно, русский алфавит считает в кодировке Unicode, а английский по дефолту есть практически в любой, но вероятность этого мала.
Линукс и юникод это синонимы
Т.е. да, считывается и выводится все в юникоде.
C++
1
2
3
4
5
6
7
8
#include <iostream>
#include <string>
 
int main()
{
    std::cout << std::string { "йцукен" }.size() << std::endl;
    std::cout << std::string { "qwerty" }.size() << std::endl;
}
1
15 / 15 / 8
Регистрация: 15.08.2013
Сообщений: 190
10.05.2016, 21:10  [ТС] 14
Nosey, т.е. дело все таки в Unicode ? из-за нее одна русская буква занимает 2 места ?
0
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
10.05.2016, 21:19 15
Цитата Сообщение от MRG_Serejka Посмотреть сообщение
т.е. дело все таки в Unicode ? из-за нее одна русская буква занимает 2 места ?
Да, utf8 используемая ubuntu, использует переменное количество байт.
Из приведенной выше ссылки на википедию:
Диапазон символов Количество байт
00000000-0000007F 1
00000080-000007FF 2
....

Русские символы попадают во второй диапазон. Т.е. кодируются двумя символами.
1
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,668
10.05.2016, 21:34 16
Используй wcin/wcout, wchar_t[] и wcslen().
1
10.05.2016, 21:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.05.2016, 21:34
Помогаю со студенческими работами здесь

VBA это миф или реальность в русской раскладке?
VBA это миф или реальность в русской раскладке?

Ubuntu 18.04 подсветка клавиатуры работает только на русской раскладке
Здравствуйте. Установил Ubuntu 18.04 adm64 Gnome. Раскладки две - английская, русская. При...

Как получить цифровой код нажатой клавиши в русской раскладке?
Как получить цифровой код нажатой клавиши в русской раскладке?

После перехода с семёрки на десятку пропала возможность писать на русской раскладке ALT-коды
Здравствуйте! После перехода с семёрки на десятку я потерял возможность писать на русской...


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

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