Programm zur Subnetz Berechnung - Hilfe



  • Hallo,

    bin noch ein rechter Neuling in der C++ Programmierung. Ich muss hier einen Rechner programmieren, bei dem man eine IP Adresse und Subnetzmaske eingeben kann, und dann die entsprechende Subnetzadresse (und ein paar andere Sachen, aber nicht wichtig) ausgibt.

    Habe das alles schon ziemlich fertig gemacht, aber hab ein großes Problem das sich von mir einfach nicht lösen lassen möchte:
    In den Variablen ipokt1, ipokt2, ... stehen immer total andere Sachen als ich eingegeben habe. Ich lasse die Variablen am Anfang ja alle auf 0 setzten, wenn ich mir den Wert der Variablen jetzt aber mal testweise am Anfang ausgeben lasse, steht nicht 0 drin sondern wieder etwas anderes!

    Könnt ihr den Fehler finden?

    Hier der Code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    
    int main(void)
    {
        int ipokt1 = 0, ipokt2 = 0, ipokt3 = 0, ipokt4 = 0, subokt1 = 0, subokt2 = 0, subokt3 = 0, subokt4 = 0, ippruef = 0, iperg = 0, suberg = 0, subpruef = 0, netzokt1 = 0, netzokt2 = 0, netzokt3 = 0, netzokt4 = 0, hostnummer = 0;
        char eingabe = 0;
        menu:
        system("cls");
        printf(" ==========IP-Rechner==========\n\n Bitte waehlen Sie:\n (a) IP-Adresse eingeben\n (b) Subnetzmaske eingeben\n (c) Berechnung starten\n (d) Programm beenden\n\n ");
         printf("%d", &ipokt1);
    	scanf("%c", &eingabe);
    	if (eingabe == 'a')
    	{
              do
              {
                    system("cls");
       	            printf(" ==========IP-Adresse==========\n\n Bitte geben Sie die IP-Adresse ein:\n ");
       	            iperg = scanf("%d.%d.%d.%d", &ipokt1, &ipokt2, &ipokt3, &ipokt4);
       	            fflush ( stdin );
                    if(ipokt1 > 0 && ipokt1 < 255 && ipokt2 >= 0 && ipokt2 <= 255 && ipokt3 >= 0 && ipokt3 <= 255 && ipokt4 >= 0 && ipokt4 <= 255)
                    {
                        ippruef = 1;
                    }
                    else
                    {
                        ippruef = 0;
                        printf("\n Fehler: Werte duerfen nur zwischen 0 und 255 sein");
                        getchar();
                    }
    
              }
              while (iperg != 4 || ippruef == 0);
              goto menu;      
        }
    
    	else if (eingabe == 'b')
    	{
              do
              {
                    system("cls");
       	            printf(" ==========Subnetzmaske==========\n\n Bitte geben Sie die Subnetzmaske ein:\n ");
       	            suberg = scanf("%d.%d.%d.%d", &subokt1, &subokt2, &subokt3, &subokt4);
       	            fflush(stdin);
                    if(subokt1 >= 0 && subokt1 <= 255 && subokt2 >= 0 && subokt2 <= 255 && subokt3 >= 0 && subokt3 <= 255 && subokt4 >= 0 && subokt4 <= 255)
                    {
                        subpruef = 1;
                    }
                    else
                    {
                        subpruef = 0;
                        printf("\n Fehler: Werte duerfen nur zwischen 0 und 255 sein");
                        getchar(); 
                    }
              }
              while (suberg != 4 || subpruef == 0);
              goto menu;    
        }
    
    	else if (eingabe == 'c')
    	{
              system("cls");
              netzokt1 = ipokt1 & subokt1;
              netzokt2 = ipokt2 & subokt2;
              netzokt3 = ipokt3 & subokt3;
              netzokt4 = ipokt4 & subokt4;
              hostnummer = ipokt4 - netzokt4;
       	      printf(" ==========Ergebnis==========\n\n IP-Adresse: %d.%d.%d.%d\n Subnetzmaske: %d.%d.%d.%d\n Subnetzadresse: %d.%d.%d.%d\n Hostnummer: %d", &ipokt1, &ipokt2, &ipokt3, &ipokt4, &subokt1, &subokt2, &subokt3, &subokt4, &netzokt1, &netzokt2, &netzokt3, &netzokt4, &hostnummer);
    	      getchar();
        }
    	else if (eingabe == 'd')
    	{
              return 0;
    	}
    	else
    	{
    		  goto menu;	   	
    	}
    	return 0;
    }
    

    ICh hoffe ich erschlag euch damit jetzt nicht.

    Vielen Dank für eure Hilfe



  • ragnar86 schrieb:

    printf("%d", &ipokt1);
    

    Tja, damit gibst Du die Adresse von ipokt1 aus. Mach mal

    printf("%d", ipokt1);
    


  • oh je, danke dafür 🙄

    Kannst du mir dann vielleicht noch erklären, warum man bei scanf vor die Variable ein & macht und bei printf nicht?



  • weil scanf wissen muss in welche Adresse es reinschreiben soll



  • Mensch, ist ja logisch..

    Wird Zeit dass es Freitag wird 😃

    Danke nochmal!



  • hi,

    int Input::create_range(const CString &_ip, const CString &_sub)
    {
    	/*char*/BYTE _subnetmask = atoi((LPCTSTR) _sub);	
    	unsigned int  itr = 0;	// schleifen zähler
    
    	CString      _ip_ = _ip;	
    	std::stringstream sstream;
    
    	_ip_.Replace(".", " ");	// werden alle . entfernt oder nur das zuerst gefundene?
    
    /*	std::string tmp;
    	tmp = (LPCSTR) _ip_;
    	sstream << tmp;*/
    	sstream << (LPCSTR) _ip_;
    
    	while(itr < 4){
    		std::string __ip_;
    		sstream >> __ip_;
    		/*unsigned char*/BYTE i_ip = atoi(__ip_.c_str());
    
    		if(_subnetmask >= 8){
    			// ist die subnetmaske größer gleich 8 wird _ip_ übernommen und in first und last 
    			// hinein geschrieben
    			CString src;
    			src.Format("%i.", i_ip);
    			first += src;
    			last += src;
    			_subnetmask -= 8; //
    		} else if(_subnetmask > 0 && _subnetmask < 8){
    			//unsigned int a = 32;
    			//int subnetmask = 4;
    
    			i_ip = (i_ip >> (8 - _subnetmask));
    			/*unsigned char*/ BYTE b = (i_ip << (8 - _subnetmask));
    
    			i_ip = 0;
    			i_ip = ~i_ip;
    			i_ip = (i_ip >> _subnetmask);
    
    			/* ****** */
    			CString container;
    			container.Format("%i.", int(b));
    			first += container;
    			/* ****** */
    			container = "";
    			b += i_ip;
    			container.Format("%i.", int(b));
    			last += container;
    			/* ****** */
    			_subnetmask = 0;
    		} else if(!_subnetmask){ // oder else if(_subnetmask == 0)
    			// ist die subnetmaske 0 so besteht eine range von 0 - 255
    			// also tragen wir die 0 in first und die 255 in last
    			first += "0.";
    			last  += "255.";
    		}			
    		itr++;
    	}
    	first.Delete(first.GetLength() - 1);
    	last.Delete(last.GetLength() - 1);
    
    	return 0;
    }
    

    du übergibst der funktion eine ip adresse und die dazugehörige subnetzmaske in cidr notation, d.h. als ganze zahl

    auf bald



  • Einfach super dieses Forum, so schnell so viele gute Antworten hätt ich nicht erwartet..

    Eine letzte Frage hab ich noch:

    Wenn ich jetzt z.B. bei meinem Programm bei der IP-Adress Eingabe vorzeitig zurück ins Menu möchte, z.B. durch drücken der C oder der ESC Taste, wie mach ich das?

    Ich hätte das so gelöst:

    if(???? == 'c')
    {
    goto menu;
    }
    

    Aber was für eine Variable soll ich da reinschreiben? Ich habe ja mehrere...


Anmelden zum Antworten