В Си, когда при приведении типа char к целому числу не будет возвращаться значение от 0 до 127? - PullRequest
2 голосов
/ 18 января 2011

В общем вопросе об интервью предлагается написать алгоритм, который обнаруживает дубликаты в строке.Использование массива символов длиной 128 для отслеживания уже увиденных символов является хорошим способом решения этой проблемы за линейное время.

В C мы будем вводить что-то вроде

char seen_chars[128];
unsigned char c;

/* set seen_chars to all zeros, assign c */

seen_chars[ c ] = 1;

Toпометьте символ c как видимый.Конечно, это зависит от

(int) c 

, возвращающего значение от 0 до 127.

Интересно, когда это не получится?Какие предположения заставляют этот код работать правильно?

Ответы [ 4 ]

3 голосов
/ 18 января 2011

Код будет давать сбой (и вызывать неопределенное поведение) каждый раз, когда целочисленное значение заданного char c не находится в диапазоне от 0 до 127 (включительно).

C никоим образом не ограничивает максимальный диапазон char - вам гарантировано, что он может содержать не менее 256 различных значений - так что в любой данной реализации C допустимое значение char может быть вне этой границы. В большинстве настольных систем char может содержать значения от -128 до 127 или от 0 до 255. Однако, в качестве примера:

char aFunction(void);
char c = aFunction();
if ((int)c > 1000000000)
    printf("This could be true on some systems\n").

Следующее будет допустимым (хотя это может исчерпать ваш стек в системах с большими char с):

#include <limits.h>
_Bool seen[1<<CHAR_BIT] = {0};
seen[(unsigned char)c] = 1;
/* etc. */
3 голосов
/ 18 января 2011

В большинстве реализаций unsigned char имеет значение от 0 до 255. Теперь ASCII определяет значения от 0 до 127, но если ваша строка содержит символы из расширенного набора символов ASCII (например, Latin1), тогда вы можете получить значения символов выше 127.

Итак, если ваш текст американский, вы в безопасности.В противном случае вы переполните свой буфер.

0 голосов
/ 18 января 2011

Мне интересно, когда это не получится?

  1. Когда у вас есть персонажи выше 127.
  2. Всякий раз, когда у вас есть многобайтовая кодировка, такая как UTF-8.
0 голосов
/ 18 января 2011

Работает со всеми 7-битными символами ascii.Другие символы, такие как немецкие умлауты, будут переведены в отрицательное число с соответствующими последствиями для вашего алгоритма.

Вы в безопасности, если вы используете unsigned char и сделаете массив 256 элементов широким.

...