Эта программа:
#include <stdio.h>
int main(void)
{
const char hhmmss[] = "10:32:54";
int hh, mm, ss;
if (sscanf(hhmmss, "%i:%i:%i", &hh, &mm, &ss) != 3)
printf("Failed to scan 3 values from '%s'\n", hhmmss);
else
printf("From <<%s>> hh = %d, mm = %d, ss = %d\n", hhmmss, hh, mm, ss);
return 0;
}
дает такой вывод:
From <<10:32:54>> hh = 10, mm = 32, ss = 54
Преобразования %02i
также должны работать, но цифры несколько лишние.
Измененный вопрос показывает, что переменные имеют тип uint8_t
, и в этом случае вы должны использовать правильные спецификаторы преобразования из <inttypes.h>
:
#include <stdio.h>
#include <inttypes.h>
int main(void)
{
const char hhmmss[] = "10:32:54";
uint8_t s;
uint8_t m;
uint8_t h;
if (sscanf(hhmmss, "%02" SCNi8 ":%02" SCNi8 ":%02" SCNi8, &h, &m, &s) != 3)
printf("Failed to scan 3 values from '%s'\n", hhmmss);
else
printf("From <<%s>> h = %d, m = %d, s = %d\n", hhmmss, h, m, s);
return 0;
}
Это выдает тот же вывод, что и раньше.Для любой из функций семейства scanf()
крайне важно, чтобы ваши спецификаторы преобразования формата соответствовали типам указателей, которые вы передаете в функцию.Вы можете избежать многих несоответствий в printf()
- конечно, для сравнения - из-за целочисленных (в частности) повышений по умолчанию, но scanf()
гораздо менее прощающе.