Textausgabe in Großschrift klappt nicht?
-
Moin,
Also ich da leider wieder ein Problem
.
Also, ich möchte ein Programm schreiben das Text der eingegeben wurde als Großschrift wieder rauskommt. Habe mich auch schon ein bischen versucht, aber klappen tut#s wieder nicht.#include <stdio.h> void main ( void ) { char zeichen[10]; while (zeichen != "END") scanf("%s",&zeichen): printf ("%s",(toupper(zeichen)); }
Also er sagt mir das der fehler nach dem ":" ist. Deswegen stellt sich die Frage
ist es möglich in einer While schleife mehrere befehle hintereinander zu ordnen? Ich habe den : extra dahin gemacht weil das Programm ja noch nicht zuende ist sondern ja noch einen befehl ausführen muss.
Also ich hoffe mal ihr könnt mir helfen.
Auf jeden fall schonmal Danke im vorraus.Thx
DarkAngel
-
while (zeichen != "END") scanf("%s",&zeichen): printf ("%s",(toupper(zeichen));
So wird das sicher nix. Der : ist einfach falsch. Ausserdem fehlt beim printf() eine schließende Klammer ....
Warum willst du die while-Schleife nicht normal coden????
while (zeichen != "END") { scanf("%s",&zeichen); // wird nicht klappen, weil toupper() ein einzelnes Zeichen verlangt printf ("%c",(toupper(zeichen))); }
So wie du dir das denkst wird das eh nichts. toupper() verlangt als Parameter ein einziges Zeichen, keinen String.
Ausserdem wird für Zeichen der Platzhalter %c verwendet.
-
while (zeichen != "END")
strings vergleichen mit = wird sowieso nix, dazu gibt es funktionen
-
Horst2 schrieb:
while (zeichen != "END")
strings vergleichen mit = wird sowieso nix, dazu gibt es funktionen
nämlich: strcmp()
erklärung: "END" ist ein zeiger und zeichen auch (in gewisser weise). und wenn man zeiger mit == vergleicht, vergleicht man die adresse auf die sie zeigen und nicht den wert, der dort steht.
-
scanf("%s",&zeichen);
Macht schonmal nicht das, was du willst. Das & muss weg.
-
Moin,
Mh schade ok Danke.
Mit der While schleife das hat mich einfach interresiert.Thx
DarkAngel
-
Moin,
Es ist zum verzweifeln einfach nur zum verzweifeln
.
#include <stdio.h> char zeichen[10]; char abbrechen = '#'; void main(void) { do { zeichen = (getc(stdin)); putc (toupper(zeichen), stdout); } while (zeichen != abbrechen); }
Was mach ich nur falsch?
Thx
DarkAngel
-
Du hast da ein Grundsätzliches Verständnisproblem mit chars und strings. Mit
char zeichen[10]
würdest du eine Zeichenkette definieren, die aus 10 einzelnen chars besteht.
Du kannst aber mit getc() nur einzelne Zeichen einlesen. Genauso will toupper() nur einzelne Zeichen, keine Zeichenketten. (In Wirklichkeit definierst du mit char zeichen[10] einen Zeiger auf ein char-Array)Wenn du das so machst:
char zeichen;
klappt es, obwohl es dann nicht so ist, wie du es haben wolltest. Auf diese Art wandelt er dir jedes einzelne Zeichen in Großbuchstaben um.
-
Moin,
ich glaube ich fang nochmal ganz von neu an.
naja Danke nochmal.Thx
DarkAngel
-
#include <stdio.h> #include <stdlib.h> const char ABBRUCH = '#'; int main(void) { char zeichen; //s. DarthZiu do { zeichen = toupper(getc(stdin)); putc(zeichen, stdout); }while(zeichen != ABBRUCH); return 0; }
ist eingentlich nicht schwer, aber du musst darauf achten, die richtigen header einzubinden!
DarthZiu schrieb:
In Wirklichkeit definierst du mit char zeichen[10] einen Zeiger auf ein char-Array
nein!
-
Ich denke du solltest dir mal eins von den Tutorials hier von der Startseite anschauen.
Die Sache mit den chars und strings ist nicht schwer, wenn mans einmal kapiert hat. Kopf hoch!
-
Splieth schrieb:
DarthZiu schrieb:
In Wirklichkeit definierst du mit char zeichen[10] einen Zeiger auf ein char-Array
nein!
Wieso nein?
-
weil arrays und pointer nicht dasselbe sind!
hier: (http://www.c-plusplus.net/forum/viewtopic.php?t=91822&start=0)
Bashar schrieb:
GoddyXB schrieb:
Erläutere Gemeinsamkeiten und Unterschiede von Arrays und Pointern in C..
Der erste Teil ist einfach. Gemeinsamkeiten: ES GIBT KEINE. PUNKT. Bitte nicht protestieren, es wird alles klar werden.
Es sind beides Zeiger auf eine Adresse und Arrays sind statisch, normale pointer hingegen dynamisch..
Völlig flachs.
Pointer sind Objekte, die eine Adresse beinhalten. Man sagt, ein Pointer zeigt auf ein anderes Objekt, und meint damit, er beinhaltet die Adresse dieses Objektes. Da C eine Sprache mit statischem Typsystem ist, gibt es für jeden Typ von Objekt einen zugeordneten Pointertyp. Also z.B. Pointer auf int, Pointer auf double, Pointer auf struct Foobar. Da Pointer selbst auch Objekte sind, gibt es dieser Logik zufolge auch Pointer auf Pointer. Z.B. Pointer auf Pointer auf int.
Man kann mit Pointern auch rechnen. Wenn ein Pointer auf ein Objekt zeigt, und man inkrementiert ihn um 1, zeigt er danach auf das im Speicher folgende Objekt. Entsprechendes gilt für die Dekrementierung.
Arrays dagegen sind zusammengesetzte Objekte. Sie bestehen aus einer Anzahl N von Objekten des gleichen Typs, die im Speicher hintereinander liegen. Auch hier gilt wieder, dass man aus jedem Datentyp Arrays herstellen kann. So kann es auch Arrays geben, die wiederum Arrays enthalten (das nennt man gerne auch mehrdimensionales Array, aber dieser Begriff dient nur der Anschauung, es gibt in C keine weitergehende Unterstützung dafür). Es kann auch Arrays geben, die Pointer enthalten. Wie arbeitet man jetzt mit Arrays?
Hier kommen jetzt wieder Pointer ins Spiel. Mit Arrays arbeiten kann man nämlich gar nicht direkt, zumindest kann man nicht besonders viel mit ihnen anfangen. Man kann nur über sizeof ihre Größe erfahren. In jedem anderen Kontext wird das Array zunächst automatisch in einen temporären Pointer auf das erste Element umgewandelt. Das erstmal sacken lassen.
Alles weitere geschieht dann über diesen Pointer. Auch der Indexzugriff, den viele anfangs als das Charakteristikum eines Arrays schlechthin ansehen. A[B] ist schlicht und einfach genau das gleiche wie *(A+B) -- siehe oben, rechnen mit Pointern. D.h. das Array A wird in einen temporären Zeiger auf das erste Element umgewandelt, darauf wird B addiert (d.h. der Ergebnispointer zeigt B Elemente weiter im Speicher, nämlich auf das (B+1)-te Element), dann wird dereferenziert. (Ein interessanter Fakt am Rande ist dabei, dass + bekanntlich kommutativ ist, d.h. dass man statt *(A+B) auch *(B+A) schreiben kann. C ist insofern konsequent, als dass folglich auch B[A] erlaubt ist und das gleiche ergibt wie A[B].)
Es ist also nicht so, dass Pointer und Arrays sich ähneln. Arrays verwandeln sich nur bei jeder Gelegenheit in temporäre Pointer, und damit arbeitet man dann.
Man kann das sicher noch verfeinern und auf die Begriffe LValue und RValue eingehen, aber dazu hatte ich jetzt keine Lust
-
Moin,
Ähhm hab ja ein Tut von der Seite hier. Es heißt C Kurs AOL Programmierung. Idt eigentlich ganz gut beschrieben aber manche sachen behandelt der in einem Programm und erklärt sie dan erst 5 Kapitel später wen man es wieder vergessen hat ^^.
Thx
DarkAngel
-
Na dann nimm ein anderes. Sind doch 7 Stück zur Auswahl.
@Splieth
Das ist äußerst interessant mit den Pointern und Arrays. Danke für die Info.
-
DarkAngel schrieb:
void main(void) ...
Was mach ich nur falsch?
abgesehen von void main? Denn das ist bereits eine Katastrophe, es heißt nämlich int main!
-
Moin,
GRRR wie oft den noch?
Es stand so im Tut wen es jemandem nicht passt soll er sich dort beschwären. oder erklärt mir wenigstens was der unterschied ist.Thx
DarkAngel
-
@DarthZiu: np
@DarkAngel:
Der Unterschied ist einfach, dass die Norm "int main()" und eben nicht "void main()" vorschreibt:
http://www.c-plusplus.net/forum/viewtopic.php?t=39346Wenn dein Tut was anderes sagt ist das schlichtweg falsch!
-
Der Grund ist einfach der, dass ein C/C++ Prog einen Rückgabewert haben muss (sollte), den du in deinem Code-Beispiel nicht hast. Der korrekte Rahmen sieht IMHO so aus:
int main(int argc, char *argv[]) { return ZAHL; }
Wobei ZAHL eine 0 ist, wenn das Programm korrekt ausgeführt wurde. Wenn es nicht korrekt ausgeführt wurde ist ZAHL eine Zahl ungleich 0.
Gleich noch zur Erklärung:
int argc - (Anzahl der Argumente, mit der das Programm aufgerufen wurde) + 1,
weil das Programm ansich auch als Argument interpretiert wirdchar *argv[] - Array mit Zeigern auf die Argumente, die beim Aufruf mitgegeben
werden.
-
DarkAngel schrieb:
Moin,
GRRR wie oft den noch?
Es stand so im Tut wen es jemandem nicht passt soll er sich dort beschwären. oder erklärt mir wenigstens was der unterschied ist.Thx
DarkAngelEs steht auch in so manchem C-Buch mit void drin. Deswegen ist es auch falsch. Die meisten Compiler akzeptieren auch kein void main()!
Sinn der Sache ist, dass das Programm einen Code zurückgibt, der besagt, ob das Programm erfolgreich oder fehlerhaft durchgelaufen ist. Schließlich will der Aufrufer ja wissen, ob das Programm erfolgreich ausgeführt werden konnte. Und der Aufrufer muss nicht immer eine Person sein ;).