Sep. 5th, 2017

frogstail: Эмблема U-124 c http://uboat.net (Default)
В 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 на этот говнокод, разумеется, не действует, больному легче не становится.


Как теперь с этим быть?

Profile

frogstail: Эмблема U-124 c http://uboat.net (Default)
frogstail

October 2019

S M T W T F S
  12345
6789 101112
13141516171819
20212223242526
2728293031  

Page Summary

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 22nd, 2025 06:07 pm
Powered by Dreamwidth Studios