1

C ++のarduinoプロジェクト用にsprintf()を使用してchar配列をフォーマットしようとしています私の目標は、次の整数をフォーマットすることです:日、月、年、時、分、秒を次のようにフォーマットします

DD / MM / YYYY HH:MM:SS

私の問題は、整数が10未満の場合に発生します。次のsprintfで修正しようとしたフォーマットを失います。

 sprintf (timeStr, "%c%u/%c%u/%u %c%u:%c%u:%c%u",(monthDay>0 && monthDay<=9)?'0':'',monthDay,(month>0 && month<=9)?'0':'',month,year,(hour>0 && hour<=9)?'0':'',hour,(minute>0 && minute<=9)?'0':'',minute,(second>0 && second<=9)?'0':'',second);

正当な値を持たない''から来ると私が想定する「空の文字定数」を取得するため、これはコンパイルされません。

ステートメント内の%cが条件付きであり、値が10未満の場合にのみ値が必要な場合に、sprintfを使用して文字列をフォーマットする方法に固執しています。

私がこれをどのように達成できるかについて誰かが何か洞察を持っているなら、私は本当にそれに固執しているのでそれを高く評価します!

ありがとうございました!

4

2 に答える 2

7

あなたは正しいです%c(ちなみに、空''そうではありません)。

ただし、ゼロパディングを使用している場合は、フォーマット指定子を使用します"%02d"か?これが、通常、ゼロが埋め込まれた数値を取得する方法です。つまり、次を使用します。

sprintf (timeStr, "%02d/%02d/%04d %02d:%02d:%02d",
    monthDay, month, year, hour, minute, second);

多くの組み込みシステムは、スペースを保持するために浮動小数点指定子を除外する(またはオプションにする)場合がありますが、ゼロパディングまたはスペースパディング整数は、すべてが持つべき非常に単純な操作です。

実装が不十分でサポートされていない場合は、空の文字列有効であるため、文字の代わりに文字列を使用できます。

sprintf (timeStr, "%s%d/%s%d/%d %s%d:%s%d:%s%d",
    (monthDay < 10) ? "0" : "",
    monthDay,
    :
    and so on ...

しかし、Arduinoはそれほど不足していないと確信しています。

于 2012-12-18T03:25:47.777 に答える
1

%c形式は常に正確に1文字を必要とするため、''許可されていません。ゼロまたは1文字の何かを印刷したい。そのために%sを使用し、条件式で文字リテラルの代わりに文字列リテラルを使用するようにすることができます(monthDay > 0 && monthDay <= 9) ? "0" : ""

于 2012-12-18T03:35:45.960 に答える