Как правильно считывать данные, размещённые через проблемы в строке при помощи функции sscanf_s ? Эта функция предназначена для безопасного чтения данных из строк.
Например, есть строка s (допустим, char s[80]; ):
aaaa bbbb cccc dddd eeee ffff gggg hhhh
И есть строки s1, s2, s3, s4, s5, s6, s7, s8 (допустим, все они типа char s1[10]; ).
Как правильно сосчитать данные из этой строки s в строки s1, s2, s3, s4, s5, s6, s7, s8 , используя опции этой функции?
Или же есть строка s:
1.234345345 2.2353647 3.34657468 4.235347 5.4756427348 6.23637568 7.3476457548 8.346758568
И есть переменные val1, val2, val3, val4, val5, val6, val7, val8 типа double.
Как правильно сосчитать данные из этой строки s в переменные val1, val2, val3, val4, val5, val6, val7, val8 , используя опции этой функции?
1613 г. = 2024 г.
Здравствуйте, RussianFellow, Вы писали:
RF>Как правильно считывать данные, размещённые через проблемы в строке при помощи функции sscanf_s ? Эта функция предназначена для безопасного чтения данных из строк.
Так же, как и sscanf. sscanf_s просто использует новые возможности компилятора с распознаванием размера буфера на этапе компиляции.
sscanf_s("aaaa bbbb cccc dddd eeee ffff gggg hhhh", "%s %s %s %s %s %s %s %s", s1, s2, s3, s4, s5, s6, s7, s8);
sscanf_s("1.234345345 2.2353647 3.34657468 4.235347 5.4756427348 6.23637568 7.3476457548 8.346758568", "%lf %lf %lf %lf %lf %lf %lf %lf", &val1, &val2, &val3, &val4, &val5, &val6, &val7, &val8);
1613 г. = 2024 г.
Здравствуйте, RussianFellow, Вы писали:
M>>Так же, как и sscanf. sscanf_s просто использует новые возможности компилятора с распознаванием размера буфера на этапе компиляции.
RF>Ну вот меня как раз и интересует распознавание размера буфера на этапе компиляции. Как с помощью этого распознавания считывать дынные из строки?
Немного ошибся с sscanf_s
Для чтения строк нужно указывать размер буфера, для чтения других типов — не нужно:
char s1[80], s2[80], s3[80], s4[80], s5[80], s6[80], s7[80], s8[80];
sscanf_s("aaaa bbbb cccc dddd eeee ffff gggg hhhh", "%s %s %s %s %s %s %s %s", s1, (unsigned)_countof(s1), s2, (unsigned)_countof(s2), s3, (unsigned)_countof(s3), s4, (unsigned)_countof(s4), s5, (unsigned)_countof(s5), s6, (unsigned)_countof(s6), s7, (unsigned)_countof(s7), s8, (unsigned)_countof(s8));
double val1, val2, val3, val4, val5, val6, val7, val8;
sscanf_s("1.234345345 2.2353647 3.34657468 4.235347 5.4756427348 6.23637568 7.3476457548 8.346758568", "%lf %lf %lf %lf %lf %lf %lf %lf", &val1, &val2, &val3, &val4, &val5, &val6, &val7, &val8);
Вопрос не ясен. На этапе компиляции для строки формата в компиляторе Visual Studio задаётся тип __declspec("SAL_IsFormatString(\"sscanf\")")
SAL_IsFormatString — расширение языка, указывающее компилятору, что на этапе компиляции нужно распарсить формат и аргументы и проверить размеры буферов и соответствие типов. Воспользоваться самому этим во своё благо как-то вряд ли можно, ИМХО.
Здравствуйте, Maniacal, Вы писали:
M>Для чтения строк нужно указывать размер буфера, для чтения других типов — не нужно:
M>M>char s1[80], s2[80], s3[80], s4[80], s5[80], s6[80], s7[80], s8[80];
M>sscanf_s("aaaa bbbb cccc dddd eeee ffff gggg hhhh", "%s %s %s %s %s %s %s %s", s1, (unsigned)_countof(s1), s2, (unsigned)_countof(s2), s3, (unsigned)_countof(s3), s4, (unsigned)_countof(s4), s5, (unsigned)_countof(s5), s6, (unsigned)_countof(s6), s7, (unsigned)_countof(s7), s8, (unsigned)_countof(s8));
M>double val1, val2, val3, val4, val5, val6, val7, val8;
M>sscanf_s("1.234345345 2.2353647 3.34657468 4.235347 5.4756427348 6.23637568 7.3476457548 8.346758568", "%lf %lf %lf %lf %lf %lf %lf %lf", &val1, &val2, &val3, &val4, &val5, &val6, &val7, &val8);
M>
Вот это мне и надо было.
Ясно, спасибо!
1613 г. = 2024 г.