Schleifendurchlauf

OP #1598974
Lesenswert?

Hallo, ich habe ein Problem bei meinem Projekt wo ich einen Analogwert 
einlese und diesen Wert über ein Terminal ausgebe.
Hier mal der Code dazu:

void Wert(float wert)
{
char ascii[50];
  int8 i;

sprintf(ascii,"Analogwert %3.1f V",wert);

  For (i=0;i<16;i++)
  {
    putc(ascii[i]);
  }
}

Das Problem ist das ich nicht weis wie lang dieser Wert ist und gib in 
der Schleife einfach mal 16 an. Wenn der Wert aber kürzer ist z.B. bei 
0.0 werden mir unnötige Nullen angezeigt.
Ich habe die For-Schleifenbedingung auch schon anderst geschrieben aber 
beides hat nicht funktioniert:
For (i=0;i<=ascii.length();i++)    oder   For (i=0;ascii[i]=='V';i++).

Gibt es noch eine Möglichkeit die Länge abzufragen und was ist bei den 
beiden Varianten falsch?

Gruß
Gast #1598985
Lesenswert?

1
void Wert(float wert)
2
{
3
char ascii[50];
4
  int8 i;
5
  sprintf(ascii,"Analogwert %3.1f V",wert);
6
  i=0;
7
  while ( ascii[i] <> 0 )
8
  {
9
    putc( ascii[i++] );
10
  }
11
}

oder, falls diese Nullterminierung als letztes mitgesendet werden soll:
1
void Wert(float wert)
2
{
3
char ascii[50];
4
  int8 i;
5
  sprintf(ascii,"Analogwert %3.1f V",wert);
6
  i=0;
7
  do
8
  {
9
    putc( ascii[i] );
10
  }
11
  while ( ascii[i++] <> 0 );
12
}

strlen würd ich nicht nehmen, da das letztendlich zwei Schleifen über 
dasselbe produziert.
#1599116
Lesenswert?

...oder gleich in
1
while ( ascii[i] )

Wenn beim Auslesen von ascii[i] eine 0 erscheint (Stringendezeichen) 
wird die Schleife abgebrochen.

Aber wahrscheinlich wird der Compiler aus
1
while ( ascii[i] )
und
1
while ( ascii[i++] != 0 )
eh den selben Code erzeugen.

Viele  Grüße,
Steffen
#1599128
Lesenswert?

Das Vernünftigste wäre es allerdings, sich einen kleinen Baukasten 
zurechtzulegen (und bei der Stringausgabe auf die Indexschreibweise zu 
verzichten. Braucht kein Mensch)
1
void putc( char c )
2
{
3
 ...
4
}
5

6
void puts( const char* s )
7
{
8
  while( *s )
9
    putc( *s++ );
10
}
11

12
void putf( float wert )
13
{
14
  char buffer[10];
15

16
  sprintf( buffer, "%f", wert );
17
  puts( buffer );
18
}
19

20
void puti( int wert )
21
{
22
  char buffer[10];
23

24
  sprintf( buffer, "%d", wert );
25
  puts( buffer );
26
}

So ist man dann für alle Fälle gerüstet und muss das Rad nicht immer neu 
erfinden. Eine Stringausgabe braucht man sowieso praktisch immer und 
warum soll man die nicht für die Ausgabe von ... äh ... Strings gleich 
mitbenutzen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren