Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » c=getchar

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
12.10.2003, 14:41 Uhr
~Newbee
Gast


Hallo,
ich hab mir vorgenommen die Programmiersprache C zu lernen mit dem Buch "Programmieren in C". Als absoluter Programmieranfänger ist mir gleich am Anfang eine Frage aufgekommen die mir nicht ganz einleuchten will...!


C++:
#include <stdio.h>

main(){
int c;
while((c=getchar()) != EOF)
  putchar(c);
}



Das Programm liest eine beliebige Zeichenkette ein und gibt sie beim drücken der Enter Taste aus. Meine Frage ist nun wie kann c als int Variable z.B. einen kompletten Satz aufnehmen, speichern und wieder ausgeben ? Ich dachte int Variablen können nur Zahlen aufnehmen ?
Mein 2 Problem ist, wie erreiche ich EOF unter Windows im DOS Fenster ?

Vielen Dank für Eure Antworten.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
12.10.2003, 15:02 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


also erst mal zum einlesen nimmst du dann halt ein array


C++:
#include <stdio.h>

main(){
int c[1000],i=0;
while((c[i]=getchar()) != EOF){
  putchar(c[i]);++i;}
}



zu deiner fragen mit den intvariablen. Innerhalb eines rechners wird alles als zahl dagestellt. Also auch die buchstaben. Der guckt dann bei der ausgabe in einer tabelle (ASCII-Code) nach wie er die zahl zu interpretieren hat. Wenn du ihm z.b. eine 65 mitgibst und ihn anweist das als char zu interpretieren wird er ein A ausgeben. Deshalb kannst du auch intvariablen nutzen um deine buchstaben zu speichern weil er sich intern nur den zum buchstaben gehörigen zahlenwert merkt
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 12.10.2003 um 15:03 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
12.10.2003, 15:10 Uhr
~Newbee
Gast


Aber wenn ich einen längeren Satz eingebe müßte doch int zu klein sein um eine so große Zahl einzugeben ? Er schreibt ja quasi solange in die Variable bis ich ENTER drücke...! Mich intressiert es einfach wie genau ein ganzer Satz in eine INT Variable passt ???
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
12.10.2003, 15:27 Uhr
Tommix



Hallo,
mit while erzeugst Du eine Schleife, d.h. es läuft immer wieder
getchar
putchar
getchar
putchar usw.
In dem i steckt immer nur ein ASCII-Wert. Ich würde hier eher char nehmen.
EOF ist Strg-Z.

Gruss, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
12.10.2003, 15:28 Uhr
Tommix



Achso, einen hab ich noch:
Dass immer der ganze Satz am Stück ausgegeben wird, liegt daran, dass die Ausgabe gepuffert wird und erst bei Enter an den Bildschirm geschickt wird.

- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
12.10.2003, 15:34 Uhr
~Newbee
Gast


getchar liest also nachdem ich ENTER gedrückt habe sozusagen Buchstabe für Buchstabe in der Konsole ein und gibt diesen Sofort wieder aus ? Ich dachte immer getchar speichert gleich das eingegebene in eine Variable!?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
12.10.2003, 15:40 Uhr
Tommix



Nein,
getchar liest ein und speichert in i. putchar gibt den Wert von i aus. Dann liest getchar einen neuen Wert, speichert in i usw. putchar steht innerhalb der Schleife.
Vielleicht ist es so etwas deutlicher:

C++:
#include <stdio.h>

int main()
{

    char c;

    while((c=getchar()) != EOF)  // Buchstabe eingeben und dauf Strg-Z prüfen
    {
        putchar(c);  // Buchstabe ausgeben
    }  // Schleife wird wiederholt, solange Buchstabe != Strg-Z

    return 0;
}



- Tommix

Dieser Post wurde am 12.10.2003 um 15:40 Uhr von Tommix editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
12.10.2003, 16:16 Uhr
Pablo
Supertux
(Operator)


Genau

die jungs haben schon alles gesagt.

Ein Zeichen kann ich eine Variable von Typ char aufgenommen werden. Wenn du aber eine Zeichenkette brauchst, dass nimmst du ein Array von char oder ein Pointer auf ein char.


C++:
char c = 'a';
char d[] = "Ich bin ein Array";
char* e = "Ich bin ein Pointer";



Pointers und Arrays sind nicht dasselbe, aber man kann in der gleichen Form behandeln und Pointer sind praktisch arrays, sowie Arrays praktisch Pointer sind.

Kommen wir zu den Zeichen zurück. Ein Zeichen (egal was, Buchstabe, Zahl, +, usw.) müssen irgendwie mit Hardware kodieret werden, damit sie gespeichert werden können. Es gibt die Tabelle der ASCII (American Standard Code for Information Interchange) mit Zeichen von 0 bis 127 und heute bis 256. Man kann ihnen eine Zahl zuordenen, wie du siehst. So ist zum Beispiel das Zeichen Nummer 48 das Zeichen '0', d.h. das Zeichen, das einer 0 entspricht.
Ein char ist ein Datentyp wie ein unsigned int aber beschränkt auf 256. char kann nicht Zahlen größer als 265 aufnehmen, sie wandelt in kleinen Zahlen um.

Also, du hast in deinem Programm eine Variable von Typ int namens c. Das geht auch, wenn du char statt von int benutzt. getchar() wartet auf das ENTER drücken und dann nimmt die Zeichen von stdin Puffer. Da jedes Zeichen eine eindeutige Zahl hat, kannst du sie als int oder char speichern, das spielt keine Rolle. Nehmen wir an, dass du hello eingegeben hast. getchar liefert den ASCII Code bzw. das char vom Zeichen 'h' und wird in int aufgenommen. Es wird überprüft, ob dieses Zeichen EOF ist. Nein, ist es nicht, also wird die einzige putchar() Anweisung der while Schleife ausgeführt. putchar() schreibt in stdout (Bildschirm) das Zeichen, das man der getchar() übergibt. Nun wird nochmal getchar() aufgerufen und jetzt leifert das 'e' zurück, und wird ausgegeben, usw, das widerholt sich, bis EOF erreicht wurde.

Unter Linux erreicht man EOF in Puffer zu schreiben, wenn man Strg+D drückt. Ich vermute, dass unter DOS der gleiche Fall ist, denn Strg+C bricht das Programm unter Linux und unter DOS ab.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
12.10.2003, 17:19 Uhr
Tommix





Zitat:
Pablo Yanez Trujillo postete
... Pointers und Arrays sind nicht dasselbe, ...
Pointer sind praktisch arrays, ...


... aber nicht theoretisch!

Gruss, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
12.10.2003, 17:27 Uhr
Pablo
Supertux
(Operator)


Ja, Pointer ist Zeiger, ein Array ist ein Feld. Sie sind 2 unterschiedliche Strukturen, die gelich verarbeitet werden können, und Ein Pointer kann als Array behandelt werden und ein Array als Pointer. Man könnte sagen, sie sind Zwillingsbruder, aber 2 verschiedene Strukturen. Das ist (meiner Meinung nach) eben das schöne an C/C++.


C++:
char* pointer= "Ich bin ein Pointer";
char  feld[] = "Ich bin ein Feld";
putchar(pointer[12]);
putchar(feld[12]);
*feld = '0';



Ausgabe: PF
printf("%s %s", pointer, feld); ist
Ich bin ein Pointer 0ch bin ein Feld. Wie du siehst, konnte ich das ertse Element von Feld ändern.

Tu jetzt aber

C++:
*pointer='0'; // bzw. pointer[0]='0';


Was kriegst du? pointer ist ein Pointer, kein Array, deshlab geht das nicht. Aber wenn ich das gemacht hätte:

C++:
char* pointer = (char*)malloc(strlen("Ich bin ein Pointer")+1);
strcpy(pointer, "Ich bin ein Pointer");



Dann könnte ich das schön.


Das ist was ich gemeint habe.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 12.10.2003 um 17:32 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: