evnuh
@evnuh
Поиск Гугл помог мне, впусти и ты его в свой дом

Почему scanf возвращает неверное значение для переменной типа size_t?

Есть такой код:
const char* cookie_format = "uid=%zu-%s"; // sscanf into uid=size_t and hmac (in hex)

size_t uid;
char hmac[40];
auto scan_count = sscanf(cookie.c_str(), cookie_format, &uid, &hmac);


На входных данных:
uid=20364-726552704a0366dc3e0ca627e6ebacdeb8ecff70
получаем следующее:
uid=20224 hmac=726552704a0366dc3e0ca627e6ebacdeb8ecff70

Почему????

Debian clang version 3.5.0-10 (tags/RELEASE_350/final) (based on LLVM 3.5.0)
Target: x86_64-pc-linux-gnu
  • Вопрос задан
  • 392 просмотра
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
char hmac[40];
auto scan_count = sscanf(cookie.c_str(), cookie_format, &uid, &hmac);

На входных данных:
uid=20364-726552704a0366dc3e0ca627e6ebacdeb8ecff70
получаем следующее:
uid=20224 hmac=726552704a0366dc3e0ca627e6ebacdeb8ecff70

Потому что hmac[40], а должен быть hmac[41] судя по тому, что в строке 40 символов. Переполнение буфера, все дела. И %s лучше заменить на %40s
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
kirill89
@kirill89
Вы уверены что входные данные верны? Попробуйте передать просто строку. Такой код дает на выходе ровно то что ожидается: 20364-726552704a0366dc3e0ca627e6ebacdeb8ecff70

size_t uid;
char hmac[41] = "";
sscanf("uid=20364-726552704a0366dc3e0ca627e6ebacdeb8ecff70", "uid=%zu-%s", &uid, &hmac[0]);
printf("%zu-%s\n", uid, hmac);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы