Изменился ли sscanf в MSVC ++ 15+? - PullRequest
0 голосов
/ 03 июля 2018

С учетом следующего фрагмента:

#include <iostream>
#include <cstring>
#include <cstdio>

int main()
{
    char color[256];
    float c,m,y,k;  
    const char* arguments = "0.8500 1 0 0 (Violet)";
    memset(color, 0, 256 * sizeof(char));
    if (sscanf(arguments, "%f %f %f %f %256c", &c, &m, &y, &k, color) == 5)
        std::cout << color; 
}

это было в производстве и работало в течение по крайней мере 10 - 15 лет (выводит название цвета):

(фиолетовый)

, но с использованием новейшего компилятора Microsoft Visual Studio или MSVC ++ 15 результат изменился. Вместо 5 результат равен 4. При использовании gcc или clang результат также равен 5, как это было в предыдущих версиях MSVC ++. Что-то не так в этом коде или кто-то знает, почему эти разные результаты между компиляторами?

1 Ответ

0 голосов
/ 03 июля 2018

"%256c" предполагает чтение точно 256 символов, как указано в стандарте C (7.21.6.2 §12):

c Соответствует последовательности символов точно такого числа, которое указано в поле ширина (1, если в директиве нет ширины поля).

Чтобы получить желаемое поведение, вы можете использовать, например. "%255s", что соответствует не более 255 (без пробелов) символов.

По вопросу о том, почему это поведение отличается (версиями) реализаций: кажется, что несколько реализаций не обеспечивают выполнение части точно , в то время как та, которую вы использовали, делает.

Поскольку ваш код основан на нестандартном поведении, прерывание кода в какой-то момент не должно быть неожиданным.

...