Как правильно пользоваться функцией sscanf_s ?
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 26.09.18 07:16
Оценка:
Как правильно считывать данные, размещённые через проблемы в строке при помощи функции 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 г.
Re: Как правильно пользоваться функцией sscanf_s ?
От: Maniacal Россия  
Дата: 26.09.18 07:35
Оценка:
Здравствуйте, 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);
Re[2]: Как правильно пользоваться функцией sscanf_s ?
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 26.09.18 08:07
Оценка:
Здравствуйте, Maniacal, Вы писали:

M>Здравствуйте, RussianFellow, Вы писали:


RF>>Как правильно считывать данные, размещённые через проблемы в строке при помощи функции sscanf_s ? Эта функция предназначена для безопасного чтения данных из строк.


M>Так же, как и sscanf. sscanf_s просто использует новые возможности компилятора с распознаванием размера буфера на этапе компиляции.


Ну вот меня как раз и интересует распознавание размера буфера на этапе компиляции. Как с помощью этого распознавания считывать дынные из строки?
1613 г. = 2024 г.
Re[3]: Как правильно пользоваться функцией sscanf_s ?
От: Maniacal Россия  
Дата: 26.09.18 08:45
Оценка: 4 (1)
Здравствуйте, 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 — расширение языка, указывающее компилятору, что на этапе компиляции нужно распарсить формат и аргументы и проверить размеры буферов и соответствие типов. Воспользоваться самому этим во своё благо как-то вряд ли можно, ИМХО.
Re[4]: Как правильно пользоваться функцией sscanf_s ?
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 26.09.18 08:50
Оценка:
Здравствуйте, 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 г.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.