putchar zeigt nichts an
-
Hallo nochmals!
Sorry aber Ich glaube ich habe etwas falsch verstanden mit den Funktionen putchar und getchar. Also bisher hat mein Programm einfach char für char von der standard eingabe gelesen, und zwar in dem ich den buffer durch ein 256-char array ersetzt habe, und diesen bei ende der eingabe (ENTER) einfach weiterverarbeitet habe. Jetzt möchte ich aber eine funktion schreiben welche mir char für char auf die standardausgabe schreibt.
void ecrireligne(char *ligne)/*schreibt 1-text auf ausgabe*/ { int i=0; while (ligne[i]!='\0') { putchar(ligne[i]); i++; } } void ecriredebug(char *texte,int num) /*schreibt 1-int und 1-text auf ausgabe*/ { int i=0; int chiffre; ecrireligne(texte); ecrireligne(" "); while (num>0) { chiffre=num % 10; num=num/10; putchar(num+48); } } int lireligne(char ligne[256]) /*lies char fur char auf der standardeingabe*/ { int c; int taille=0; int fin=0; setbuf(stdin,ligne); /*write(STDOUT_FILENO,"myshell>",8);*/ ecrireligne("myshell"); while (fin==0 && taille<256) { c=getchar(); if (c!=10) taille++; else fin=1; } return taille; }
int main(int argc,char **argv){ char ligne[256]; /*pointeur sur un char,,qui contient la ligne entrée par l'utilisateur*/ int i; int NoExit=1; /*NoExit<0 -> Programm wird schnellstmoeglich verlassen*/ ecrireligne("bla"); /*text wird nur manchmal angezeigt*/ ecriredebug("length(exit):",4); /*also nur wenn lireligne() nicht aufgerufen wird*/ /*shell core*/ while (NoExit==1) { length = lireligne(ligne); /*wird diese zeile weggelassen, wird der text angezeigt*/ if(StringCompare(ligne,"exit")!=0) { system(ligne); } else{ NoExit=0; } } return 0; }
Der text "bla" und "length(exit): 4" werden sauber angezeigt wenn ich die Zeile "length = lireligne(ligne)" weglasse, allerdings so wie der Code jetzt da steht funktioniert es überhaupt nicht
.
Freue mich auf jede Antwort,
mit freundlichen Grüssen,
Laurent :xmas1:
-
Kannst du nochmal genauer erläutern, was nun angezeigt wird und was nicht?
PS: Was für eine Sprache ist das überhaupt? Und was sprincht dagegen, die existierenden C-Funktionen (fgets(), printf() etc) zu verwenden?
-
Danke für deine recht schnelle Antwort!
Also bezüglich der Frage der Sprache gehe ich davon aus dass du die Namen der Funktionen meinst
Also die sind in französisch! Frag aber nicht warum es sei denn du willst nen Aufsatz von 20Seiten lesen
Also, das Programm wie es da steht zeigt rein gar nichts an. Nur wenn ich die Zeile "length = lireligne(ligne);" aus der main() funktion entferne, wird "shell>" angezeigt, und dann eben noch "bla" und "length(exit): 4".Meine Frage wäre an sich nur warum wenn die Funktion lireligne(..) nicht aufgerufen
wird, der Text sauber angezeigt wird, und wenn sie aufgerufen wird, sämtliche Textausgaben unterdrückt werden.Zur Frage warum ich printf/scanf etc nicht benutzen ist der Grund dass ich eine Einlese-funktion gebrauchen muss, welche alle Tasten die der Benutzer gedrückt hat zurückgibt. Meines Wissens nach müsste die getchar() Funktion dies können! Es muss also sichergestellt werden dass alle Tasten die der Benutzer drückt ehe er <ENTER> drückt in den Buffer gespeichert werden, und danach verarbeitet werden können. Glaub(s)t du/ihr dass dies eine gute Annäherung ist?
Hoffe ich habe dir hiermit deine Fragen beantwortet, und tut mir leid für den langen Post, aber habe wohl die Gewohnheit verloren kurz und knackiges Deutsch zu schreiben
-
Hallo bloggi,
ich habe mir mal deinen Code angesehen und ein paar Korrekturen
eingebaut. An den Kommentarzeilen erkennst du, was ich geändert habe:#include <stdio.h> #include <string.h> #include <stdlib.h> void ecrireligne(char *ligne) { int i=0; while (ligne[i]!='\0') putchar(ligne[i++]); /* putchar buffert die Ausgabe => fflush() */ fflush(stdout); /* damit die Ausgabe in die Konsole geschrieben wird */ } void ecriredebug(char *texte,int num) { int chiffre; ecrireligne(texte); ecrireligne(" "); while (num>0) { chiffre=num % 10; num=num/10; putchar(num+48); } fflush(stdout); /* damit die Ausgabe in die Konsole geschrieben wird */ } int lireligne(char ligne[256]) { int c; int taille=0; int fin=0; setbuf(stdin, ligne); memset(ligne, 0x0, 256); /* initialisiert den Speicher, so dass keine merkwürdigen Zeichen enthalten sind. */ ecrireligne("myshell: "); while (fin==0 && taille<256){ c=getchar(); switch (c) { case '\n' : fin=1; ligne[taille]='\0'; /* entfernt die Eingabe von Enter */ break; default : taille++; break; } } return taille; } int main(void){ char ligne[256]; int NoExit=1; ecrireligne("bla\n"); ecriredebug("length(exit):",4); /*shell core*/ while (NoExit==1) { int length = lireligne(ligne); /* hier war ein Fehler: length war nicth definiert.*/ printf(">%s< lenght: %d\n", ligne, length); /* Debug zeile zum Überprüfen der Eingabe */ if(strcmp(ligne,"exit")!=0) system(ligne); /* StringCompare ersetzt, da Funktion nicht vorhanden war */ else NoExit=0; } return 0; }
Gruß mcr
-
Klasse! bin jetzt echt froh dass es doch noch geklappt hat!
Danke vielmals!