char array buchstaben einzeln auslesen

OP #912095
Lesenswert?
• ▲
▼
ich habe folgenden Pointer auf ein chararray, welcher an die Funktion 
übergeben wird:
1
funktion("hallo");
2

3

4
void funktion(char *data){
5

6
    char text[10];
7
    // jetzt möchte ich den 5. Buchstaben ausgeben
8
    sprintf(text, "%s", data[4])
9
    // nur funktioniert das nicht
10
}

wie kann ich das machen???

danke im voraus

Sönke
Persönliche Seite #912097
Lesenswert?
• ▲
▼
Sönke Paschko wrote:
> ich habe folgenden Pointer auf ein chararray, welcher an die Funktion
> übergeben wird:
>
>
1
> 
2
> funktion("hallo");
3
> 
4
> 
5
> void funktion(char *data){
6
> 
7
>     char text[10];
8
>     // jetzt möchte ich den 5. Buchstaben ausgeben
9
>     sprintf(text, "%s", data[4])
10
>     // nur funktioniert das nicht
11
> }
12
>

Probiers mal mit
1
sprintf(text, "%c", data[4]);

Oder
1
text[0] = data[4];
2
text[1] = '\0';
Gast #912100
Lesenswert?
• ▲
▼
>sprintf(text, "%c", data[4]);

sprintf() gibt gar nichts aus. Damit kopiert man nur
Texte in einen Speicherbereich. Bei dir "text".
Den kannst du dann mit puts(text); oder printf("%s",text);
ausgeben.
Persönliche Seite #912134
Lesenswert?
• ▲
▼
holger wrote:
>>sprintf(text, "%c", data[4]);
>
> sprintf() gibt gar nichts aus. Damit kopiert man nur
> Texte in einen Speicherbereich. Bei dir "text".
> Den kannst du dann mit puts(text); oder printf("%s",text);
> ausgeben.

Wo steht was von "ausgeben" ;) Okay im Quelltext. Aber ich denke mal 
dass er sich dessen schon bewusst ist.
OP #912175
Lesenswert?
• ▲
▼
erstmal danke für die Antworten. leider geht das nicht, ich hol mal ein 
wenig weiter aus:

ich habe eine Funktion welche Buchstaben auf einem LCD anzeigt. diese 
heist lcd_data(unsigned char temp1); (die gleiche wie im Tutorial)
dieser funktion muss ich einen Buchstaben übergeben.

nun bekommt meine Funktion ein wort, welches buchstabenweise an die 
funktion lcd_data weitergeleitet werden soll. nur halt nicht wie in der 
Funktion lcd_string(); sondern in einer anderen Reihenfolge. ich möchte, 
das der text sozosagen einfliegt von links, also, dass erst der lezte 
Buchstabe, dann die beiden letzten usw. angezeigt werden. hierzu 
benötige ich die einzelnen buchstaben. so soll das dann ungefär im 
programm ablaufen:
1
funktion("hallo"); // aufruf mit Wort
2

3
void funktion(char *data){
4

5
lcd_data(data[4]);
6
lcd_clear();
7
lcd_data(data[3]);
8
lcd_data(data[4]);
9
...
10
// natürlich mit schleifen verallgemeinert
11
}

weder das funktioniert noch das vorherige Umwandeln in der form mit 
sprintf, wie es oben vorgeschlagen wurde.

hier nochmal die Funktion lcd_data:
1
 
2
void lcd_data(unsigned char temp1)
3
{
4
   unsigned char temp2 = temp1;
5
 
6
   LCD_PORT |= (1<<LCD_RS);        // RS auf 1 setzen
7
 
8
   temp1 = temp1 >> 4;
9
   temp1 = temp1 & 0x0F;
10
   LCD_PORT &= 0xF0;
11
   LCD_PORT |= temp1;               // setzen
12
   lcd_enable();
13
 
14
   temp2 = temp2 & 0x0F;
15
   LCD_PORT &= 0xF0;
16
   LCD_PORT |= temp2;               // setzen
17
   lcd_enable();
18
   
19
   _delay_us(42);
20
}
Gast #912239
Lesenswert?
• ▲
▼
Mal angenommen dein wirres Zeugs da oben meint das was ich meine,
hier mein bescheidener Vorschlag. Da die Länge des Strings wohl
bekannt sein wird, empfiehlt es sich die mit zu übergeben und auch
zu benutzen.

1
void funktion(char *data)
2
{
3
   char * d = data;
4
   while(*d++);
5
   while(--d>=data)
6
         lcd_data(*data);
7
}
Gast #912247
Lesenswert?
• ▲
▼
Hallo,
meine Funktion war Mist, hier ne neue Version ;-)


void lcd_funktion(char *data)
{
   char count = 0;
   char *save = data;
   while(*data)
   {
       data++;
       count++;
   }


   while(count != 0)
   {
      data = save;
      count -= 1;
      data += count;
      while(*data)
      {
         lcd_data(*data);
         data++;
      }
   }
}

Gruss
Gast #912253
Lesenswert?
• ▲
▼
Viel bringt nicht viel ;-). Besonders nicht auf dem Stack ...


#include <stdio.h>

void funktion(char *data)
{
   char * d = data;
   while(*d++);
   while(--d>=data)
         printf("%c",*d);
   printf("\n");
}

int main()
{
    funktion("HALLO");
}
Persönliche Seite #912380
Lesenswert?
• ▲
▼
1
funktion("hallo"); // aufruf mit Wort
2

3
void funktion(char *data){
4

5
lcd_data(data[4]);
6
lcd_clear();
7
lcd_data(data[3]);
8
lcd_data(data[4]);

Das kann auch gar nicht funktionieren. "hallo" hat vier Zeichen - 
worauf greift data[4] zu? Nein, nicht auf das 'o'.

Du solltest Dich --damit Du auch die Dir gemachten Lösungsvorschläge 
verstehst-- mal mit der Arrayindizierung von C vertraut machen.
#912382
Lesenswert?
• ▲
▼
Meine Version
1
void FlyIn( const char* string )
2
{
3
  uint8_t len = strlen( string ) - 1;
4

5
  while( len > 0 ) {
6
    lcd_clear();
7
    lcd_string( string + len );
8
    _delay_ms( 100 );
9
    len--;
10
  }
11

12
  lcd_clear();
13
  lcd_string( string );
14
}

PS: Gott sei dank willst du den Text von links einfliegen
lassen. Dadurch kannst du dir das ganze Gerödel mit der
Einzelzeichenverarbeitung sparen. Die String-Funktionalität
erledigt das wunderbar. Man muss nur wissen, dass ein String
immer von der Startadresse bis zum ersten '\0' Zeichen geht.
Wenn ich also einen String habe, dann brauche ich nur der
String-verarbeitenden Funktion (in dem Fall lcd_string) eine
falsche Startadresse vorgaukeln und sie bearbeitet den 'Teilstring'
von dieser gefälschten Startadresse bis zum Stringende.

Wenn du von rechts einfliegen lassen willst, dann geht das nicht
mehr so einfach. Da könnte man allerdings ausnutzen, dass das
LCD (zb ein 16 Zeichen breites LCD) am rechten Rand einige Stellen
hat, die es nicht anzeigt.
#912401
Lesenswert?
• ▲
▼
Karl heinz Buchegger wrote:
>
1
> void FlyIn( const char* string )
2
> {
3
>   uint8_t len = strlen( string ) - 1;
4
> 
5
>   while( len > 0 ) {
6
>     lcd_clear();
7
>     lcd_string( string + len );
8
>     _delay_ms( 100 );
9
>     len--;
10
>   }
11
> 
12
>   lcd_clear();
13
>   lcd_string( string );
14
> }
15
>


Ist noch früh am Morgen.
Das geht auch einfacher (und vor allen Dingen: richtiger)
1
void FlyIn( const char* string )
2
{
3
  uint8_t len = strlen( string );
4

5
  while( len > 0 ) {
6
    lcd_clear();
7
    lcd_string( string + len-- );
8
    _delay_ms( 100 );
9
  }
10
}

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