Forum: Mikrocontroller und Digitale Elektronik "0" in vorschieben wenn nur einstellig.


von Markus P. (sebastianwurst)


Lesenswert?

Hallo,

ich lasse mir eine email aus dem NET IO mit folgendem Code senden 
(s.unten):

Kurz gesagt, ich sende mir die Zeit wann die Dämmerung eingesetzt hat. 
Wenn das jetzt um z.B.: 19:06:03 Uhr passiert ist. Bekomme ich als mail 
19:6:3 -> die Nullen werden "abgeschnitten". An Sich ja auch 
logisch...gibt es jedoch eine Möglichkeit die Nullen mit in die email zu 
packen? Ist halt nur ne rein optische Sache, der Lesbarkeit wegen...

Vielen Dank!

uint8_t iDaemmerung_hh;
uint8_t iDaemmerung_mm;
uint8_t iDaemmerung_ss;
1
    strcpy_P(&mail_buffer[z], PSTR("\r\n\r\nDämmerung: ")); //copy mail text
2
    z += 15;    
3
    
4
    mail_length1 = 0;
5
  
6
  
7
    //itoa (iDaemmerung_hh,conv_buffer,10);        //convert temp value
8
    itoa (iDaemmerung_hh,conv_buffer,10);      //convert temp value
9
    mail_length1 = strnlen(conv_buffer,CONVERSION_BUFFER_LEN);
10
    memmove(&mail_buffer[z],conv_buffer,mail_length1);
11
    z += mail_length1;  
12
    
13
14
    //mail_length1 = strnlen(":",CONVERSION_BUFFER_LEN);
15
    //memmove(&mail_buffer[z],":",mail_length1);
16
    //z += mail_length1;  
17
    
18
    strcpy_P(&mail_buffer[z], PSTR(":")); //copy mail text
19
     z += 1;  
20
    mail_length1 = 0;
21
    
22
    itoa (iDaemmerung_mm,conv_buffer,10);      //convert temp value
23
    mail_length1 = strnlen(conv_buffer,CONVERSION_BUFFER_LEN);
24
    memmove(&mail_buffer[z],conv_buffer,mail_length1);
25
    z += mail_length1;  
26
    
27
    strcpy_P(&mail_buffer[z], PSTR(":")); //copy mail text
28
     z += 1;
29
    mail_length1 = 0;
30
    
31
    itoa (iDaemmerung_ss,conv_buffer,10);      //convert temp value
32
    mail_length1 = strnlen(conv_buffer,CONVERSION_BUFFER_LEN);
33
    memmove(&mail_buffer[z],conv_buffer,mail_length1);
34
    z += mail_length1;

: Bearbeitet durch Moderator
von Peter D. (peda)


Lesenswert?

Für formatierte Ausgaben nimmt man sprintf.

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Du könntest jeweils prüfen, ob die Zahl einstellig ist (<10) und dann 
vorher eine "0" in den mail_buffer schreiben.

Alternativ, wenn Du genügend Speicher frei hast, kannst Du auch sprintf 
verwenden. Ist halt universell einsetzbar, braucht aber Platz. Sieht 
aber im Code viel besser aus.

: Bearbeitet durch User
von Mike (Gast)


Lesenswert?

Du könntest, wenn iDaemmerung_hh, iDaemmerung_mm oder iDaemmerung_ss <10 
sind, vorher eine "0" in mail_buffer schreiben.

von holger (Gast)


Lesenswert?

sprintf benutzen oder:
1
    if(iDaemmerung_hh < 10)
2
    {
3
      conv_buffer[0] = '0';
4
      itoa (iDaemmerung_hh,&conv_buffer[1],10);
5
    }
6
    else itoa (iDaemmerung_hh,conv_buffer,10);

von Sascha W. (sascha-w)


Lesenswert?

Hallo,

Die Länge des Strings nach der Convertierung mit itoa ermittelst du ja 
schon, dann füge doch einfach noch eine '0' ein wenn der String nur ein 
Zeichen lang ist.

Sascha

von Markus P. (sebastianwurst)


Lesenswert?

Peter Dannegger schrieb:
> Für formatierte Ausgaben nimmt man sprintf.

Danke:
sprintf(conv_buffer, "%02i", (int)iDaemmerung_ss);

von Stefan E. (sternst)


Lesenswert?

Sorry, aber das Ganze sieht ein wenig aus nach "wie mache ich es 
möglichst umständlich".

1
mail_buffer[z++] = iDaemmerung_hh / 10 + '0';
2
mail_buffer[z++] = iDaemmerung_hh % 10 + '0';
3
mail_buffer[z++] = ':';
4
mail_buffer[z++] = iDaemmerung_mm / 10 + '0';
5
mail_buffer[z++] = iDaemmerung_mm % 10 + '0';
6
mail_buffer[z++] = ':';
7
mail_buffer[z++] = iDaemmerung_ss / 10 + '0';
8
mail_buffer[z++] = iDaemmerung_ss % 10 + '0';

von holger (Gast)


Lesenswert?

>Sorry, aber das Ganze sieht ein wenig aus nach "wie mache ich es
>möglichst umständlich".

Bah, alles in eine Zeile;)

sprintf("%02i:%02i:%02i",(int)iDaemmerung_hh),(int)iDaemmerung_mm),(int) 
iDaemmerung_ss));

von holger (Gast)


Lesenswert?

>Bah, alles in eine Zeile;)
>
>sprintf("%02i:%02i:%02i",(int)iDaemmerung_hh),(int)iDaemmerung_mm),(int )
>iDaemmerung_ss));

Sorry hab da was vergessen.

sprintf(conv_buffer, 
"%02i:%02i:%02i",(int)iDaemmerung_hh),(int)iDaemmerung_mm),(int)
iDaemmerung_ss));

von Karl H. (kbuchegg)


Lesenswert?

holger schrieb:
>>Bah, alles in eine Zeile;)
>>
>>sprintf("%02i:%02i:%02i",(int)iDaemmerung_hh),(int)iDaemmerung_mm),(in t)
>>iDaemmerung_ss));
>
> Sorry hab da was vergessen.
>
> sprintf(conv_buffer,
> "%02i:%02i:%02i",(int)iDaemmerung_hh),(int)iDaemmerung_mm),(int)
> iDaemmerung_ss));

Wenn du es gleich in die mail einsetzt, dann braucht er sich auch nicht 
die Finger brechen, wie er den Teilstring möglichst kompliziert in die 
Mail einsetzt
1
  sprintf_P( &mail_buffer[z], PSTR("\r\n\r\nDämmerung: %02i:%02i:%02i"),
2
             (int)iDaemmerung_hh),(int)iDaemmerung_mm),(int)iDaemmerung_ss );
fertig. Ersetzt den kompletten Code aus dem Eröffnungsposting. Ok, um 
das z müsste man sich noch kümmern, falls man das überhaupt braucht.

An den TO.
Du solltest dir dringend in deinem C-Buch das Kapitel über Strings 
ansehen und lernen mit den str Funktionen umzugehen (auf dem AVR gibt es 
auch die jeweiligen xxx_P Funktionen dazu wo sie sinnvoll sind). So 
etwas
1
                    memcpy(&eth_buffer[TCP_DATA_START_VAR],mail_auth_str,strlen(mail_auth_str)+1);
2
                    memcpy_P(&eth_buffer[TCP_DATA_START_VAR+strlen(mail_auth_str)],PSTR("\r\n"),2);
ist einfach nur grober Unfug.

von Markus (Gast)


Lesenswert?

Alles klar, danke. Ist halt historisch gewachsen das ding und viel 
Ahnung von strings habe ich wirklich nicht...

von Dirk B. (dirkb2)


Lesenswert?

Karl Heinz schrieb:
> Ok, um
> das z müsste man sich noch kümmern, falls man das überhaupt braucht.
sprintf gibt die Anzahl der ausgegebenen Zeichen zurück.
Daher ist auch das einfach
1
 z += sprintf_P(....

von Peter II (Gast)


Lesenswert?

> sprintf_P( &mail_buffer[z], PSTR("\r\n\r\nDämmerung: %02i:%02i:%02i"),
>             (int)iDaemmerung_hh),(int)iDaemmerung_mm),(int)
> iDaemmerung_ss );

was soll eigentlich diese int casterrei?

http://www.gnu.org/software/libc/manual/html_node/Calling-Variadics.html#Calling-Variadics
[...]
Since the prototype doesn’t specify types for optional arguments, in a 
call to a variadic function the default argument promotions are 
performed on the optional argument values. This means the objects of 
type char or short int (whether signed or not) are promoted to either 
int or unsigned int, as appropriate; and that objects of type float are 
promoted to type double. So, if the caller passes a char as an optional 
argument, it is promoted to an int, and the function can access it with 
va_arg (ap, int).
[...]

von Karl H. (kbuchegg)


Lesenswert?

Peter II schrieb:
>> sprintf_P( &mail_buffer[z], PSTR("\r\n\r\nDämmerung: %02i:%02i:%02i"),
>>             (int)iDaemmerung_hh),(int)iDaemmerung_mm),(int)
>> iDaemmerung_ss );
>
> was soll eigentlich diese int casterrei?

Falls irgendjemand mal auf die Schnapsidee kommt, aus iDaemmerung_hh 
einen long zu machen, stirbt nicht gleich alles den Ehrentod.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.
Lade...