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

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Akord
Сообщения: 2
Зарегистрирован: 22 май 2010, 21:59

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

Код: Выделить всё

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++;
		}
	}
Аватара пользователя
Decoder
Сообщения: 308
Зарегистрирован: 19 фев 2008, 23:11
Откуда: Moscow

Проблема в этом выражении: uniq[(int) source[q]].
Дело в том, что массив source имеет тип char. А диапазон значений для типа char от -128 до 127.
Соответственно, для русских символов значение source[q] будет отрицательным. В итоге ты пытаешься получить элемент из массива uniq по отрицательному индексу.
Исправить это можно так:

Код: Выделить всё

 
        int index = (source[q] < 0)? 256+source[q] : source[q];
        if (!uniq[index])
        {
            . . . . 
            uniq[index] = true;
            . . . .
        }
Поумнеть несложно, куда труднее от дури избавиться.
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Decoder писал(а):Проблема в этом выражении: uniq[(int) source[q]].
Дело в том, что массив source имеет тип char. А диапазон значений для типа char от -128 до 127.
Соответственно, для русских символов значение source[q] будет отрицательным. В итоге ты пытаешься получить элемент из массива uniq по отрицательному индексу.
Исправить это можно так:
.......
Не проще ли объявление
char source[1024];
заменить на
unsigned char source[1024];
?
Аватара пользователя
Decoder
Сообщения: 308
Зарегистрирован: 19 фев 2008, 23:11
Откуда: Moscow

Функция gets(), с помощью которой вводятся символы с клавиатуры, на входе принимает массив именно как char*. Можно конечно вместо gets() использовать циклический ввод одиночных символов (например: функция getchar(), которая возвращает int), но это ещё больше усложнит код.
Поумнеть несложно, куда труднее от дури избавиться.
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Decoder писал(а):Функция gets(), с помощью которой вводятся символы с клавиатуры, на входе принимает массив именно как char*. Можно конечно вместо gets() использовать циклический ввод одиночных символов (например: функция getchar(), которая возвращает int), но это ещё больше усложнит код.
Господи! Я вас умАляю! А то Вы не знаете, как в таких случаях делается?

Код: Выделить всё

unsigned char source[1024];
...........
gets ((char*) source);
И никаких проблем!
Ответить