Посчитать количество повторений символов
Нужно посчитать количество повторений символов, которые ввожу с клавиатуры, но проблема в том, что нужно использовать кодировку Windows chcp 1251. Когда ввожу букву, например, "Т", - считывается код символа и он равен -46, хотя в 1251 его код 210. Подозреваю, я неправильно понимаю, какого типа должны быть считанные данные, char или int. Подскажите:
#define MAX 256
char text[3000];
void main(void)
{
setlocale(LC_CTYPE, "ukr");
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
gets_s(text);
Probability();
getchar();
}
void Probability(void)
{
int* c = (int*)&text[0];
int i;
int m = 0; // кількість символів у файлі (без повторень)
while (*c != 0) {
int repeat = 0; // чи перевірявся символ
int count = 1; // кількість повторень певного символа
for (i = 0; i < MAX; i++) {
if (*c == checked[i]) {
repeat = 1; // символ уже перевірявся
break;
}
}
if (repeat == 0) {
checked[m] = *c;
int* comp = c + 1;
while (*comp != 0) {
if (*comp == *c) {
count++;
}
}
numbers[m] = count;
m++;
}
c++;
}
}
Ответы (2 шт):
-46, хотя в 1251 его код 210.
открою маленький секрет - символ - это unsigned char - у него значение от 0 до 255
ну а когда вы используете char у которого значение от -128 до 127, то и получаются такие вещи
кстати
(signed char)-46 = (unsigned char)(256 - 46) = (unsigned char)210
так что просто поаккуратнее с типами,
-46 и 210 это одно и тоже, просто одно было некорректно преобразовано
С выставленным кодом стало больше ясности
char text[3000];
int* c = (int*)&text[0];
Итак, что происходит с данным кодом:
допустим есть строка
text = "abcdefghijk"
в ней text[0] = 'a', text[1] = 'b' и т.д.
теперь что происходит - вы говорите, что переменная c указывает на область в памяти, в которой хранятся int, т.е. 4байтовые сущности
в итоге x[0] = 'abcd' в виде числа, это уже не символ, это число около миллиарда