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

Тема в разделе "Общие вопросы по С и С++", создана пользователем Akord, 26 сен 2010.

  1. Akord

    Akord Гость

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

    Код (Text):
    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++;
    }
    }
     
  2. Trupik

    Trupik Гость

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

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

    User1C Гость

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

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

    int main()
    {

    int b;

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

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    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 или уникод (в зависимости от случая)
     
  5. Trupik

    Trupik Гость

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

    DarkKnight Well-Known Member
    C\C++ Team

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

    Ну или если уж точно знаешь как именно будет использоваться программа, что лишних значений не будет можно использовать, но опять же на свой страх и риск.... Вот недавно только писал по этой теме...
    http://codeby.net/ipb.html?s=&sh...st&p=185181
     
Загрузка...
Похожие Темы - Русские символы
  1. slavon-x86
    Ответов:
    5
    Просмотров:
    5.099
  2. divankin
    Ответов:
    2
    Просмотров:
    1.379
  3. alexstudent
    Ответов:
    0
    Просмотров:
    1.642
  4. iosif88
    Ответов:
    2
    Просмотров:
    3.287
  5. ksyun
    Ответов:
    4
    Просмотров:
    2.429

Поделиться этой страницей