Русские символы

  • Автор темы Akord
  • Дата начала
A

Akord

Это критичная часть кода для понимания вопроса. Помогите сделать так, чтобы также и русские символы обрабатывались. Понятия не имею, в чем дело...

Код:
struct node
{
char sym[10];
float pro;
int code[20];
int top;
}s[256];

typedef struct node node;

void main()
{
node temp;
char source[1024];
memset(s, 0, 256*sizeof(node));
memset(source, 0, 1024);
printf("\nplease, enter a source string: ");
gets(source);

int len = strlen(source);
bool uniq[256] = {0};
int j = 0;

// в s уникальные символы из строчки
for (int q = 0; q < len; q++)
{
if (!uniq[(int) source[q]])
{
s[j].sym[0] = source[q];
uniq[(int) source[q]] = true;
j++;
}
}
 
T

Trupik

Кириллица находится в верхней половине таблицы кодов символов, т.е. у тебя получается обращение к элементу массива с отрицательным индексом. Преобразовывай к беззнаковому типу.

Ну, и массив uniq не инициализирован — поведение программы зависит от положения звёзд на небе.
 
U

User1C

Помогите сделать так, чтобы также и русские символы обрабатывались. Понятия не имею, в чем дело...
Вот так попробуй:

char buf[256];
char* rus(const char* text)
{
CharToOem(text, buf);
return buf;
}

int main()
{

int b;

printf(rus("ведите число:\n"));
scanf("%d",&:);
}
 
D

DarkKnight

2User1C : Проблема в том, что вы забываете, что Windows OS перестала правильно работать с консолью еще с выходом Windows ME, так что требуется установка локали или же писать код в 866-код. странице...

Вот код, который будет правильно выводиться в консоли, и без ваших странных функций "rus" :)
p.s. CharToOem - играла смысл при выводе в файл, но никак ни в консоль :)

C++:
#include <iostream>


void main()
{
setlocale(LC_ALL, ".ACP"); //Вот именно то что тебе нужно

char buf[256];

int b;

printf("ведите число:\n");
scanf("%d",&b); 

}

2Akord: Послушай Trupik'а, парень действительно дело говорит, и вообще как только мы имеем дело не с латиницей, всегда используй либо unsigned int или уникод (в зависимости от случая)
 
T

Trupik

как только мы имеем дело не с латиницей, всегда используй либо unsigned int или уникод (в зависимости от случая)
Преобразовывать надо в тип того же размера, чтобы вместо слишком маленького (отрицательного) числа не получить слишком большое.
 
D

DarkKnight

Преобразовывать надо в тип того же размера, чтобы вместо слишком маленького (отрицательного) числа не получить слишком большое.
(!)Либо в тип большего размера, и тогда слово "слишком" вообще не применимо
практика доказывает, что unsigned char под Виндой с некоторых случаях глючит (именно при использовании в консольных выражениям и именно для символьных кодов)....

Ну или если уж точно знаешь как именно будет использоваться программа, что лишних значений не будет можно использовать, но опять же на свой страх и риск.... Вот недавно только писал по этой теме...
link removed
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!