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!
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 | }
|
void sendString( const char* s ) { for( unsigned int i = 0; i<strlen(s); ++i ) { lcdputchar( tmps[i] ); } }
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 ;-)
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.
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
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.
@ 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; } }
Danke euch allen, aber die Antwort von Thomas finde ich persönlich am leitesten zu verstehen :) LG
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.
>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 ...
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.