Непонятная проблема с sscanf

Тема в разделе "Arduino & Shields", создана пользователем user999, 2 мар 2017.

  1. user999

    user999 Гик

    Добрый день!

    Получаю с сервера точное время и записываю его в модуль часов реального времени.
    Заметил странную ошибку: "8"-ки и "9"-ки превращаются в "0".
    Вот кусок кода отвечающий за обработку ответа сервера (для примера обновляю каждую сек., а так раз в сутки):

    Код (C++):
    int dayTime, monthTime, yearTime, hourTime, minuteTime, secondTime, weekTime;
            char timeServer[ansver.length()+1];
            ansver.toCharArray(timeServer, ansver.length()+1);
            sscanf (timeServer, "%i:%i:%i:%i:%i:%i:%i", &dayTime, &monthTime, &yearTime, &hourTime, &minuteTime, &secondTime, &weekTime);
            if (weekTime == 0) weekTime = 7;
            rtc.setDate(dayTime, monthTime, yearTime);
            rtc.setTime(hourTime, minuteTime, secondTime);
            rtc.setDOW(weekTime);
            Serial.print(String(ansver)+"\t"+String(dayTime)+"."+String(monthTime)+"."+String(yearTime)+" "+String(hourTime)+":"+String(minuteTime)+":"+String(secondTime)+", "+String(weekTime));        
    А вот то, что я вижу в сериалпорт:
    Код (C++):
    02:03:2017:16:23:59:4    2.3.2017 16:23:59, 4
    02:03:2017:16:24:00:4    2.3.2017 16:24:0, 4
    02:03:2017:16:24:01:4    2.3.2017 16:24:1, 4
    02:03:2017:16:24:02:4    2.3.2017 16:24:2, 4
    02:03:2017:16:24:03:4    2.3.2017 16:24:3, 4
    02:03:2017:16:24:05:4    2.3.2017 16:24:5, 4
    02:03:2017:16:24:06:4    2.3.2017 16:24:6, 4
    02:03:2017:16:24:07:4    2.3.2017 16:24:7, 4
    02:03:2017:16:24:08:4    2.3.2017 16:24:0, 4
    02:03:2017:16:24:09:4    2.3.2017 16:24:0, 4
    02:03:2017:16:24:10:4    2.3.2017 16:24:10, 4
    02:03:2017:16:24:11:4    2.3.2017 16:24:11, 4
    Как видно вместо 8-ки и 9-ки в секундах нули, тоже самое и на минутах происходит. В чем может быть косяк?
     
  2. rkit

    rkit Гуру

    %d читает десятичные числа, а не %i
     
    user999 нравится это.
  3. user999

    user999 Гик

    действительно так. Но странно почему именно 8 и 9
     
  4. AlexU

    AlexU Гуру

    Формат '%i' говорит о том, что ожидается число. При чём, в отличии от формата '%d', число может быть в разных системах счисления -- 16-тиричные числа должны начинаться с '0x', восьмиричные с '0' (ноль), остальные считаются десятичными.
    Числа 00, 01, 02, ... 07 -- это восьмиричные числа. Числа 08 и 09 рассматриваются как восмиричные, т.к. начинаются с '0', но как не корректные, поэтому сканер преобразует их в 0.
     
    user999 нравится это.
  5. user999

    user999 Гик

    Спасибо за разъяснение