mikrocontroller.net

Forum: Compiler & IDEs einzelne Zeichen aus String auslesen in C


Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe folgende Frage. Wie kann ich einen char z.B. 'Test' in ein 
Array o.Ä. zerlegen, sodass ich dann jeden einzellnen Buchstaben von 
'Test' auslesen kann.
Ich habe nähmlich ein Display und ein Befehl lcdputchar(); mit dem kann 
ich aber jeweils nur einen Buchstaben bearbeiten. Ich würde das nun 
gerne in eine Schleife packen, sodass ich ganze Wörter ans LCD schicken 
kann.

Vielen Dank vorrab!

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na, nix einfacher als das:

int main() {
  char *p;
  char mein_array[] = "Test";
  char zeichen1, zeichen2, zeichen3;

  zeichen1 = mein_array[0];
  zeichen2 = mein_array[1];
  zeichen3 = mein_array[2];


  p = mein_array;
  while (*p != 0) {
    lcdputchar(*p);
    p++;
  }

}



Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void sendString( const char* s ) {
   for( unsigned int i = 0; i<strlen(s); ++i ) {
     lcdputchar( tmps[i] );
    }
}

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oha, (mal wieder) ein Neuling ;-)

Das macht man in C anders:

Man definiere ein Array (hier nur Beispiel):
 char beispielArray[] = "Testtext!";

Dann diese Funktion implementieren:

void lcdPutString( char * dat )
{
 char * pStr;

 pStr = dat;

 for(;*pStr!=0;pStr++)
 {
  lcdPutchar( *pStr );
 }
}

Und rufe dann auf:

lcdPutString( beispielArray );

Sollte eigentlich Funktionieren ;-)

Alternativ, kann man auch ohne Arraydefinition:

lcdPutString( "Testtext" );

aufrufen.

Alles klar ;-)

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter wrote:
> void sendString( const char* s ) {
>    for( unsigned int i = 0; i<strlen(s); ++i ) {
>      lcdputchar( tmps[i] );
>     }
> }

Idee is natürlich absplut korrent, aber ich glaub, das is umständlich 
und in C syntaktisch nicht korrekt:

* C verbietet diese Form von Deklarationen direkt im Schleifenkopf 
drinne, glaub ich...
* und der Aufruf von strlen(s) wird bei jedem Schleifendurchlauf 
geschehen, was sicherlich ineffizient ist.

Nur der Vollständigkeit halber^^, nichts für Ungut.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mist. Hab zu lange zum Tippen gbraucht ;-)

Autor: Thomas Bremer (Firma: Druckerei Beste) (virtupic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alllsssooo...

Du hast einen String z.B. "Test" - nicht das, was in deiner Anfrage 
steht. Und ein String ist in C ein Array von char - wobei in C ein Array 
durch einen Zeiger auf das erste Element repräsentiert ist:

char text[]; // Array
oder
char *text; // Zeiger

Und darin kannst du jedes Zeichen ganz einfach indizieren:

text[0] liefert dir das erste Zeichen,
text[1] liefert dir das zweite Zeichen,
usw.

Hinten an den Text wird noch der Wert 0 angehängt. Heißt, wenn text den 
String "Test" enthält, dann ist text[4] == 0.

Anscheinend willst du so was machen wie

void display(char *text) {
  int i;
  for (i = 0; text[i]; i++) lcdputchar(text[i]);
}

virtuPIC

Autor: Random ... (thorstendb) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Micha wrote:
> Hallo,
>
> Wie kann ich einen char z.B. 'Test' in ein Array o.Ä. zerlegen,
Vorsicht!
'zeichen' gibt immer nur ein zeichen an, mit ausnahme der '\zeichen', 
die werden vom compiler in eine zahl übersetzt.
'A' z.B. ergibt 65. Dient der besseren lesbarkeit.
'TEST' gibt es nicht, höchstens "Test".

Beachte:
Ein String (z.B. char text[10];) muss immer um eins grösser sein als die 
abzuspeichernden zeichen, da dort noch das string-ende-zeichen '\0' oder 
einfach 0x00 mit dran muss (für string-funktionen wie z.B. printf).

Solch ein array kannste dann einfach mit nem pointer oder dem array 
selbst durchlaufen:

zeichen = text[pointer++]

do{...}
while(*(++text));

usw...



VG,
/r.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Sven Pauli
* und der Aufruf von strlen(s) wird bei jedem Schleifendurchlauf
geschehen, was sicherlich ineffizient ist.

ich hatte vermutet das der compiler es selber optimiert, ist ja const. 
Aber habe mich gerade selber überzeugt das es nicht so ist.

dann halt anders
void sendString( const char* s ) {
    while ( *s )
     lcdputchar( *s );
     ++s;
    }
 }

Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke euch allen, aber die Antwort von Thomas finde ich persönlich am 
leitesten zu verstehen :)
LG

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter wrote:
> @ Sven Pauli
> * und der Aufruf von strlen(s) wird bei jedem Schleifendurchlauf
> geschehen, was sicherlich ineffizient ist.
>
> ich hatte vermutet das der compiler es selber optimiert, ist ja const.
> Aber habe mich gerade selber überzeugt das es nicht so ist.

Hätte ich eigentlich auch erwartet... nur sind mir im letzten Moment 
wieder die Geschichten mit Seiteneffekten eingefallen, die Funktionen 
haben könnten.

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Hätte ich eigentlich auch erwartet... nur sind mir im letzten Moment
>wieder die Geschichten mit Seiteneffekten eingefallen, die Funktionen
>haben könnten.

das hat nix mit Seiteneffekten zu tun,
sondern damit, dass der Compiler ja gar nicht wissen kann was für ein 
String da wohl irgndwann ausgegeben wird ...

Autor: Random ... (thorstendb) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Micha wrote:
> Danke euch allen, aber die Antwort von Thomas finde ich persönlich am
> leitesten zu verstehen :)
> LG

Joah, ...
C ist nicht das einfachste, aber sicherlich eine der geilsten Sprachen, 
wenn man sich in die Pointersachen eingefuchst hat.
Schnell, effizient, kein wunder, dass die Sprache trotz des "hohen" 
Alters immer noch _DIE_ Sprache ist, wenn es um Schnelligkeit und 
Effizienz geht (von ASM einmal abgesehen).
Apropos: Unix (AT&T) ist als "Testumgebung" bei der genannten 
Telefonfirma entstanden :-)

VG,
/r.

Autor: Jones (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo.

habe mal eine (Anfänger-) Frage dazu.

kann man das ganze auch als int verwenden?
und dann mehrere Bytes drin ablegen?

also irgendwie so:

int test_var[] = 0x00, 0x01, 0x02, 0x03, 0x08;


wie viele "Einträge" können denn dann definiert werden bzw. wieviele 
zeichen kann der Text bei einer Char[] Array lang sein?


Danke.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jones wrote:
> Hallo.
>
> habe mal eine (Anfänger-) Frage dazu.
>
> kann man das ganze auch als int verwenden?

Sicher. Sowas nennt man dann in seiner allgemeinen Form ein
Array oder mit der deutschen Bezeichnung: ein Feld.

> kann man das ganze auch als int verwenden?
> und dann mehrere Bytes drin ablegen?

Wenn du da Bytes ablegen willst, dann ist ein int nicht unbedingt
eine gute Wahl für den Arraytyp. Ein int belegt mindestens 2 Bytes,
d.h. du schenkst jedes 2-te Byte her.

> also irgendwie so:
>
> int test_var[] = 0x00, 0x01, 0x02, 0x03, 0x08;
>

Bei Bytes
unsigned char test_var[] = { 0x00, 0x01, 0x02, 0x03, 0x08 };

Beachte die { } Klammern. Die sind notwendig um eine Initialisierung
anzugeben. Strings sind in der Beziehung ein Sonderfall.

>
> wie viele "Einträge" können denn dann definiert werden bzw. wieviele
> zeichen kann der Text bei einer Char[] Array lang sein?

soviele bis dir der Compiler sagt: mehr geht nicht, weil sonst der
Speicher nicht ausreichen würde, oder eine sonstige Beschränkung
zum Zuge kommt (zb. weil die Indizierung mittels int gemacht wird und
ein int nur bis maximal 32767 hoch geht)

Näheres dazu findest du in jedem (und ich meine wirklich jedem)
Lehrbuch über die Programmiersprache C.

Autor: Jones (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank!

hilft mir sicher weiter!

ja, ein C-Buch habe ich, bin allerdings noc nicht weit mit dem lesen 
gekommen. .. schäm

also nochmal Danke!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.