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


von Micha (Gast)


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!

von Sven P. (Gast)


Lesenswert?

Na, nix einfacher als das:
1
int main() {
2
  char *p;
3
  char mein_array[] = "Test";
4
  char zeichen1, zeichen2, zeichen3;
5
6
  zeichen1 = mein_array[0];
7
  zeichen2 = mein_array[1];
8
  zeichen3 = mein_array[2];
9
10
11
  p = mein_array;
12
  while (*p != 0) {
13
    lcdputchar(*p);
14
    p++;
15
  }
16
17
}

von Peter (Gast)


Lesenswert?

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

von Matthias (Gast)


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 ;-)

von Sven P. (Gast)


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.

von Matthias (Gast)


Lesenswert?

Mist. Hab zu lange zum Tippen gbraucht ;-)

von Thomas B. (Firma: Druckerei Beste) (virtupic)


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

von Random .. (thorstendb) Benutzerseite


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.

von Peter (Gast)


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;
    }
 }

von Micha (Gast)


Lesenswert?

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

von Sven P. (Gast)


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.

von Walter (Gast)


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 ...

von Random .. (thorstendb) Benutzerseite


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.

von Jones (Gast)


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.

von Karl H. (kbuchegg)


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.

von Jones (Gast)


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!

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.