Pointer wider willen + struct



  • Hallo ihr lieben c freunde ich hätte dann mal wieder ein Problem bei den ich nicht weiterkomme und wo ich auf eure Hilfe hoffe.

    Zuerst mal eine grobe Erklärung:

    In einer makefile befindet sich ein selbstdeffinierter Datentyp.
    In der main methode wird nun ein pointer auf diesen selbstdeffinierten datentyp gerichtet, anschließend wird der pointer an eine funktion übergeben welche eigentlich nur zwei werte aus einer txt datei liest und diese dann in den selbstdeffinierten datentyp hinterlegt, wobei wie gesagt der pointer übergeben wurde.

    So jetzt das ganze etwas anschaulich mit quellcode

    die Headerdatei in der, der selbstdeffinierte datentyp steht, interessant für mein problemn ist eigentlich nur publickey

    //Datentypen     
            //------------------------------------------------
           	struct key {
        		long int s;       //Teil des oeffentlichen schluessels
        		long int t;       //Teil des privaten schluessels
        		long int k;       //RSA Modul
        	}; 
            typedef struct key key;
    
            //------------------------------------------------
        	struct privatkey {
        		long int t;        //Geiheimexponent
        		long int k;        //RSA Modul
        	}; 
            typedef struct privatkey privatkey;
    
            //------------------------------------------------
        	struct publickey {
        		long int s;        //Oeffentlicher exponent
        		long int k;        //RSA Modul
        	}; 
            typedef struct publickey publickey;
            //------------------------------------------------
    

    Nun zu der eigentlichen funktion (lediglich ein auszug) die mir ärger bereitet

    int codedsubmenueone (publickey *publickey) {
        //Variablendeffinition/ -belegung
        int i = 0;
        int flag = 0;
        char eingabe;
        char chv[255];
        char pfad[255];
        char c;
        FILE *in;                                                   //Zeiger auf eine Datei
    
        do {
            flag = 0;                 //Entscheidungsvariable wird vordeffiniert
            //Konsole leeren
            clearconsole();
            //Public Key ermitteln
                printf("Bitte treffen sie ihre Wahl:\n\n");
                printf("1) Schluessel befindet sich in einer Datei\n");
                printf("2) Schluessel per Hand eingeben\n");
                printf("3) Zurueck zum Hauptmenue\n\n\n");
                printf("> ");
    
            // Eingabe abfangen
                scanf("%c",&eingabe);
                while (getchar() != '\n');
    
            // weitere Navigation , weiterleitung je nach auswahl des Nutzers
                switch (eingabe) {
                       //=====================================================================================================
                       case '1' :                                                                    //Schluessel ist in Datei
                            do {
                                flag = 0;                 //Entscheidungsvariable wird vordeffiniert
                                //Konsole leeren 
                                clearconsole();
                                //Pfad eingabe, wo ist der public key
                                printf("Bitte geben sie den Pfad der Datei, in welcher sich der public key befindet, an!\n\n");
                                printf("> ");
                                //Eingabe abfangen
                                scanf("%254[^\n]", &pfad);
                                while (getchar() != '\n');
                                //teste ob pfad existent
                                in = fopen(pfad,"r");
                                if (in == NULL){        //ungueltige eingabe, pfad nicht existent
                                   printf("Ungueltiger Pfad eingegeben: <%s>\n", pfad);
                                   getchar();
                                   flag=1;
                                } else {               //PublicKey Datei ist vorhanden der Public key kann ausgelesen werden 
                                   //Test 
                                   printf("Gueltiger pfad");
                                   getchar();       
                                   flag = 0;               //Entscheidungsvariable wird vordeffiniert
                                   i = 0;                  //Zaehlvariable wird vordeffiniert
                                   //Schleife zum auslesen des Public Keys 
    
    				//==============================================================================================
    				//Und ab hier haut irgend etwas glaub ich nicht hin
    
                                   while((c = fgetc(in)) != EOF) {
                                            //grenze zwischen s und k finden
                                            if (c==';') {
                                               //Variablendeffinition
                                               flag = 1;          
                                               i = 0;
                                               //s in publickey abspeichern
                                               publickey->s=(long int)chv;  
                                            } else {            //Grenzpunkt noch nicht gefunden 
                                                if (flag==0) {  //Auslesen von s
                                                   chv[i] = c;             //Zwischenspeichern
                                                } else {        //Auslesen von k
                                                   chv[i] = c;             //Zwischenspeichern
                                                }
                                                //Zaehelvariable erhoen
                                                i++;
                                            }
                                   } 
                                   //k in publickey abspeichern   
                                   publickey->k=(long int)chv;
                                   //Datei wieder schliessen 
                                   fclose(in);
                                   //Testen wir das ganze 
                                   printf("%li, %li",publickey->s, publickey->k); 
                                   getchar();   
    
    				//====================================================================================================
                                	//Hier geht es dann weiter aber das ist erst mal unrelevant
    

    Zu meinen problem ich mache am ende ja einen kleinen test

    printf("%li, %li",publickey->s, publickey->k);
    

    Der mir die werte anzeigen soll, nun kriege ich aber erstens imm zwei identische werte ausgegeben und zweitens steht dieser wert nicht mal ansatzweise in der Datei.

    Ich hoffe ich konnte mich einigermaßen verständlich machen wo mein problem ist bzw. wo meine schwierigkeit liegt und hoffe mir kann jemand helfen.

    Auf jeden fall vielen dank an alle die bis hierher durchgehalten haben.

    Anmerkung: In der Datei befinden sich zwei zahlen werte welche im long int bereich liegen diese sind durch ein ";" getrennt.


  • Mod

    long int k;        //RSA Modul
    
    // ...
    
        char chv[255];
    
    // ...
    
    publickey->k=(long int)chv;
    

    Das kommt dir nicht irgendwie komisch vor? Was glaubst du, wieso der Compiler sich da ohne Cast weigert?



  • (long int)chv
    

    Das tut nicht, was du glaubst.

    Konstantin1507 schrieb:

    if (flag==0) {  //Auslesen von s
        chv[i] = c;             //Zwischenspeichern
    } else {        //Auslesen von k
        chv[i] = c;             //Zwischenspeichern
    }
    

    Du machst im if- und im else-Zweig dasselbe. Wozu also das if?



  • struct publickey {
                long int s;        //Oeffentlicher exponent
                long int k;        //RSA Modul
            };
    
    char chv[255];
    ...
    publickey->k=(long int)chv; // Was meinst du was hier passiert?
    // chv ist (in diesem Fall) ein Zeiger aufdas Array, wo du die (Zahl?)-Zeichen reinkopiert hast.
    

    Du brauchst strtol und ein vernünftiges C-Buch



  • Ich bedanke mich vielmals für die schnelle hund konspirative kritik. Jetzt funzt es:))


Anmelden zum Antworten