bitte mal ansehen



  • getchar wartet auch bis ein Zeichen da ist.



  • Wenn Du 'Enter' drückst, stehen alle vorher gedrückten Tasten in einem Puffer. getchar holt sich jetzt das erste Zeichen aus diesem Puffer. Weil es in einer Schleife immer wieder wieder aufgerufen wird, holt es sich Zeichen für Zeichen aus dem Puffer, bis keines mehr da ist, bzw. die Schleife beendet wird.

    Besten Dank, das hab ich gemeint.
    getchar liest quasi ein Zeichen und "verwirft" es dann und kann somit das nächste aus dem Puffer "lesen". right?



  • 'verwirft' ... es liefert Dir ein Zeichen und entfernt es aus dem Puffer. Beim nächsten Aufruf liest es dann das nächste Zeichen und entfernt es ...
    Sollte keines mehr im Puffer zur Verfügung stehen --> siehe DirkB, wartet getchar, d.h. die Funktion kehrt nicht zurück, bis es wieder was abzuholen gibt.



  • So.. hier mein erster Versuch mit Charpointer und Malloc...
    Also... zerreißt mich bitte. (nicht über Sinn und Unsinn des Programms, ist nur zum probieren)

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <mylib.h>
    #define  maxline 30
    
    void sub1( char *p1, int mem); 
    
    int main(int argc, char *argv[])
    
    {
    char *t1;
    
    puts("scan for t1");
    scanf("%c", &t1);
    printf("Charpointer b4 Changing : %c\n", t1);
    t1 = malloc(maxline); 
    sub1(t1, maxline); 
    puts("sub2...ended\n");
    
    printf("%s", t1);
    
    free(t1); 
    
    system("PAUSE");	
      return 0;
    }
    
    void sub1( char *p1, int mem)
    {
    
    keyb();
    puts("sub1...running");
    
    puts("enter");
    fgets(p1, mem, stdin); 
    
    printf("%s\n", p1); 
    printf("%c\n", *p1);
    
    }
    

    Irgendwie funktioniert es. Aber naja, das erste scanf und das auslesen ist schon irgendwie anders als ich vermutet habe, da man doch wenn man auf den "Wert" des Pointers zugreifen will normal mit * arbeitet...?

    char *p1; 
    char test;
    
    p1=&test;
    scanf("%c" &test);
    printf("%c", *p1);
    

    Liegt das daran, das ich dem Pointer zuvor keine Adresse zugewisen habe??



  • Wie du schon richtig vermutet hast, ist der Teil mit dem scnaf Mist.

    char *t1; // Zeiger zeigt irgendwo hin
    
    scanf("%c", &t1);  //hier nimmst du den Speicherplatz von t1 selber, um darin ein Zeichen abzulegen
    printf("Charpointer b4 Changing : %c\n", t1);
    

    Das funktioniert nur, wenn sizof(char) <= sizeof(char*) ist.

    Ein Zeiger ist wie ein Zettel, auf dem man sich notiert, wo die Sachen/Informationen liegen.
    Du hast jetzt die Information auf dem Zettel selber notiert.



  • Auch wenn das funktioniert, ist das natürlich kein guter Stil, schlecht, böse, pfui, ....



  • ja, das mit dem scanf... vergessen wir das mal.
    Das der Stil Müll ist, war mir klar.
    Hauptsächlich geht es mir darum ob jetzt noch "gravierende" Fehler drin sind, also das Programm nur zufällig funktioniert, oder ob es trotz des schlechten Stils prinzipiell "richtig"(soweit man hier davon sprechen kann) ist.

    Frage: malloc in einer Funktion reserviert den Speicher nur in der Funktion oder? Wenn ich aus der Funktion zurückkehre ist der Speicher im Nivana, ich kann dann in meinem Beispiel "t1" nicht anzeigen lassen(als string).

    Frage: wenn ich für ein Char speicher reserviere... hört sich blöd an aber wird aus dem einen Char dann eine Art "Chararray"?



  • Nur um den Mist mit dem scanf kurz zu "verbessern"

    char *t1 ,  t2;
    t1= &t2;
    
    puts("scan for t1");
    scanf("%c", &t2);
    printf("Charpointer b4 Changing : %c\n", *t1);
    


  • scanf("%c", t1);
    

    geht dann (t1 zeigt auf gültigen Speicher) auch.



  • von dem restl. Code... Ist noch was gravierend falsch?



  • hier hat sich mir die Frage aufgestellt ob aus dem einzelnen Char duch die Speicherzuweisung irgendwie ein "indirektes char array" wird...?

    printf("%s\n", p1);
    printf("%c\n", *p1);
    

    *p1 wäre der "wert" des Pointers....
    p1 hmm... warum funktioniert p1. Das wäre doch normal die Adrese? Aber nur bei Arrays ist der Name auch die Adresse...



  • ...etwas weil p1 auf einen gültigen Speicherbereich zeigt??



  • beginner88888 schrieb:

    Frage: malloc in einer Funktion reserviert den Speicher nur in der Funktion oder? Wenn ich aus der Funktion zurückkehre ist der Speicher im Nivana, ich kann dann in meinem Beispiel "t1" nicht anzeigen lassen(als string).

    Nein. Der Speicher von malloc hat keinen Scope.
    Der Pointer, dem du die Adresse zuweist allerdings schon

    beginner88888 schrieb:

    Frage: wenn ich für ein Char speicher reserviere... hört sich blöd an aber wird aus dem einen Char dann eine Art "Chararray"?

    beginner88888 schrieb:

    hier hat sich mir die Frage aufgestellt ob aus dem einzelnen Char duch die Speicherzuweisung irgendwie ein "indirektes char array" wird...?

    Du kannst mit einem Pointer auch in der Arrayschreibweise auf den Speicher zugreifen.
    p1[0] oder *p1 ist das selbe.
    (der Compiler wandelt selbst jedes a[i] in *(a+i) um)

    beginner88888 schrieb:

    printf("%s\n", p1);
    printf("%c\n", *p1);
    

    %s erwartet den Zeiger auf einen Nullterminierten Speicherbereich.
    %c erwartet ein Zeichen

    beginner88888 schrieb:

    *p1 wäre der "wert" des Pointers....

    Nein. Das ergibt den Inhalt des Speichers auf den der Pointer zeigt.

    beginner88888 schrieb:

    p1 hmm... warum funktioniert p1. Das wäre doch normal die Adrese? Aber nur bei Arrays ist der Name auch die Adresse...

    Ein Pointer ist auch nur eine Variable. Da wird halt keine Ganzzahl oder Fließkommazahl oder ... gespeichert, sondern eine Adresse.
    Mit p1 kommst du an diese Adresse.
    Mit dem Dereferenzierungsoperator * kommst du an den Wert, an dieser Adresse.
    Der Pointer selber hat auch einen Speicherbereich. An den kommst du mit dem Adressoperator &

    Bei einem Array gibt es keinen Speicher wo die Adresse abgelegt ist. Nur der Speicher von dem Array.

    Bei deinem Beispiel hast du Speicher für malloc (30 char) und den Speicherplatz von t1 (hängt vom System ab)



  • Danke @ DirkB.

    Ohne scheiß, du solltest mal ein C Buch schreiben! Finde deine Beiträge immer sehr verständlich.

    Danke


Anmelden zum Antworten