Ciudad de Ojuelos
Sep. 5th, 2017 10:21 pmВ Visual Studio 2015 поломали sscanf. Как поломали: в кодировке 1251 шаблоны на русском языке не работают.
Теперь нельзя просто взять и написать:
const char* str = "номер 100";
int num;
const int n_scanned = sscanf( str, "номер %d", &num );
n_scanned будет равно нулю, num не прочитан, в чём дело?
Глубоко в недрах sscanf есть конечный автомат, сопоставляющий строку с шаблоном. Он вызывает в цикле int get_char() для получения символа строки или -1 — EOF.
Далее этот int ojuelos pedoroso из микрософт сравнивают с символом шаблона (типа signed char) без приведения типов к signed char. Символ строки, попавший в int претерпевает расширение знакового бита (в кодировке 1251 там стоит единица) и сравнение производится между значениями 0xFFFFFFXX и 0x000000XX. Естественно, шаблона sscanf в строке не находит и работать отказывается.
Установка locale на этот говнокод, разумеется, не действует, больному легче не становится.
Как теперь с этим быть?
Теперь нельзя просто взять и написать:
const char* str = "номер 100";
int num;
const int n_scanned = sscanf( str, "номер %d", &num );
n_scanned будет равно нулю, num не прочитан, в чём дело?
Глубоко в недрах sscanf есть конечный автомат, сопоставляющий строку с шаблоном. Он вызывает в цикле int get_char() для получения символа строки или -1 — EOF.
Далее этот int ojuelos pedoroso из микрософт сравнивают с символом шаблона (типа signed char) без приведения типов к signed char. Символ строки, попавший в int претерпевает расширение знакового бита (в кодировке 1251 там стоит единица) и сравнение производится между значениями 0xFFFFFFXX и 0x000000XX. Естественно, шаблона sscanf в строке не находит и работать отказывается.
Установка locale на этот говнокод, разумеется, не действует, больному легче не становится.
Как теперь с этим быть?