Problem mit strok

Dieses Thema im Forum "C/C++" wurde erstellt von alter, 15.04.2008.

  1. alter

    alter Grünschnabel

    Dabei seit:
    27.03.2008
    Beiträge:
    8
    Zustimmungen:
    0
    Hallo,

    folg. Code:
    Code:
    #include <stdio.h>
    #include <string.h>
    
    /*************************************************************************/
    // splittet nach "." und "/"
    // nice to use for 172.31.32.0/24
    int split(int * ar, char buffer[]){
    	int i = 0;
    	char * pch;
    
    	pch = strtok(buffer, "./"); 
    	while (pch != NULL){
    		// printf("%s\n", pch);
    		ar[i] = atoi(pch);
    		pch = strtok (NULL, "./");
    		i++;
    	}
    	return i;
    }
    
    /*************************************************************************/
    int main(){
    	int *a;
    	int *b;
    	
    	split(a, "1.2.3");
    	split(b, "4.5.6");
    	printf("%d %d %d\n", a[0], a[1], a[2]); // 4 5 6 !?
    
    	return 0;
    }
    
    
    In der split() kommen a und b nacheinander richtig an, aber so wie es aussieht, wird a letztendlich überschrieben in der main().

    Wie ist das Problem zu erklären && zu lösen?

    Viele Grüße!
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 x0r, 15.04.2008
    Zuletzt bearbeitet: 15.04.2008
    x0r

    x0r Bitschubser

    Dabei seit:
    20.12.2005
    Beiträge:
    169
    Zustimmungen:
    0
    Ort:
    Berlin
    Mahltid,

    in int main()
    Code:
    int *a;
    int *b;
    
    Zeiger definiert ohne Initialisierung ... nix gut, zeigt irgenwo hin, was du hier zurück kriegst wenn Du dereferenzierst ist schlichweg unfug.

    Code:
    	split(a, "1.2.3"); // zeigen immer noch ins nirvana
    	split(b, "4.5.6"); // --//--
    	printf("%d %d %d\n", a[0], a[1], a[2]); // 4 5 6 !? // dereferenziert nirvana daten ;D
    
    Ohne Wertzuweisung (Funktionsergebnis ?!) keine Vernünftige Ausgabe.

    in int split()
    Code:
    return i;
    
    Selbst mit Wertzuweisung kriegst Du hier nur den Stand d. Zählschleifenintegers nach dem die while()-Bedingung wahr geworden ist, also ich würde mal sagen ... 3 xD

    Probier es doch mal so:

    Code:
    #include <stdio.h>
    #include <string.h>
    
    /*************************************************************************/
    // splittet nach "." und "/"
    // nice to use for 172.31.32.0/24
    int split(int *&ar, char buffer[]){
    	int i = 0;
    	char * pch;
    
            pch = strtok(buffer, "./"); 
    	while(pch!=NULL) 
    	{
              	ar[i] = atoi(pch);
    		pch = strtok (NULL, "./");
    		i++;
    	}
    	return i;
    }
    
    /*************************************************************************/
    int main(){
    	int *a = (int)malloc(5*sizeof(int));  // auch zeiger auf int aber gleich 
    	int *b = (int)malloc(5*sizeof(int));  // speicher alloz. für 5 ints (die IP oktette und der CIDR-partikel)
            int iZaehler = 0;
    
           while(iZaehler<4) // saubere initialisierung
           {
                   a[iZaehler] = 0;
                   b[iZaehler] = 0;
                   iZaehler++;
            }
    
    	split(a, "1.2.3");  // a hat nach Durchlauf die nach '.' und '/' getrennten
    	split(b, "4.5.6");  // ints genau wie b
    
            iZaehler = 0;
            while(iZaehler<4) // saubere initialisierung
            {
                   printf("%d", a[iZaehler]); // 4 5 6 !?
                   iZaehler++;
            }
    
            // mit *b machst Du es ebenso ...
        
    
    
    	return 0;
    }
    

    MfG
     
  4. #3 alter, 15.04.2008
    Zuletzt bearbeitet: 15.04.2008
    alter

    alter Grünschnabel

    Dabei seit:
    27.03.2008
    Beiträge:
    8
    Zustimmungen:
    0
    Ahhh, malloc, vielen Dank!!!

    Die Initialisierung war es also, was P. macht. Wieder was dazugelernt, danke nochmal.

    Edit:
    Die Initialisierung könnte ich ja auch wie folgt machen (die Größe der int-Arrays steht fest, da kommen maximal 5 Zahlen drauf):

    Code:
    int main(){
    	int a[] = {0,0,0,0,0};
    	int b[] = {0,0,0,0,0};
    	
    	split(a, "1.2.3");
    	split(b, "4.5.6");
    	
    	printf("%d.%d.%d\n", a[0], a[1], a[2]); // 1.2.3
    	printf("%d.%d.%d\n", b[0], b[1], b[2]); // 4.5.6
    	return 0;
    }
    
    Eigentlich könnte hier nichts mehr schiefgehen oder? Als Zeichenketten sind IP-Adresse/Maskenlänge zu erwarten, und auch, dass sich der User mal vertippt und was Längeres eingibt...

    Bitte mal prüfen....

    Viele Grüße!

    PS: Wer möchte, kann das Programm "ipcalc.exe" (Sorry, DOS) mal testen. ipcalc ermöglicht Kalkulationen von IP-Adressen und Subnetzen.

    Zu finden hier: http://rolfrost.de/cgi-bin/filebase.cgi
    Was dieses und die anderen Kommandozeilenprogramme tun, habe ich hier beschrieben:
    http://rolfrost.de/cprogramme.html

    Für mich als Perl-Freak ist seit den Schlechtwettertagen des diesjährigen Osterwochenende Programmieren in c wieder ein erstklassiges und schönes Thema. Zwischen Perl und c liegen Welten, das sage ich jetzt, wo ich meine bisher umfangreichste Perl-Library "julian-lib" (für Kalenderberechnungen) nach c umgeschrieben habe.

    Von c nach Perl,das ist einfach, aber zurück nach c, das hat es in sich ;)

    Meine "julian-lib.c" ermöglicht Kalenderberechnungen vom Tag 0 (1.1.-4713) bis heute, wobei die Gregorianische Kalenderreform nahtlos eingebaut ist:

    Code:
    D:\_c\exe>mon 10 1582
    
     Oktober 1582
    
    KW  Mo Di Mi Do Fr Sa So
    40  01 02 03 04 15 16 17
    41  18 19 20 21 22 23 24
    42  25 26 27 28 29 30 31
    
    Gerne wüsste ich auch, was Ihr so programmiert :)

    Viele Grüße,
    Rolf
     
  5. alter

    alter Grünschnabel

    Dabei seit:
    27.03.2008
    Beiträge:
    8
    Zustimmungen:
    0
    @xOr,

    Dein Code
    Code:
    int *a = (int)malloc(5*sizeof(int));
    
    casted nicht richtig, besser machs so:
    Code:
    int *a = (int*)malloc(5*sizeof(int));
    
    Viele Grüße!
     
  6. #5 blue-dev, 23.04.2008
    blue-dev

    blue-dev stranger with blue eyes

    Dabei seit:
    30.06.2007
    Beiträge:
    438
    Zustimmungen:
    0
    Dafür bräuchte man eigentlich einen "Nützliche Codeschnipsel Thread", kannst ja einen aufmachen.
    Ich hab als letztes einen 120-sekunden-billig blocker für ddl Seiten geschrieben.
    Total simpel und hat wirklich nur 120 Sekunden Tippzeit gebraucht:
    Code:
    #!/usr/bin/perl
    use strict;
    
    while (1) {
    sleep(1);
    my $letzte_zeile;
    open(DAT, "<hosts");
    while(<DAT>)
     {
     $letzte_zeile = $_; 
     }
    close(DAT);
    
    my $pat = "127.0.0.1 rapidshare.com megaupload.com uploaded.to stealth.to secured.in netload.in thepiratebay.org torrentspy.com";
    
    if ($letzte_zeile ne $pat) {
    open(DAT, ">>hosts");
    print DAT $pat;
    close(DAT);
    }
    }
    Brauchte mein Nachbar weil sein Sohn da immer "Zeugs" runterlädt.
    Er kommt zwar drauf die hosts Datei zu ändern aber auf die Prozesse zu achten, dafür ist er zu blöde ;)
     
  7. alter

    alter Grünschnabel

    Dabei seit:
    27.03.2008
    Beiträge:
    8
    Zustimmungen:
    0
    Klaro blue-dev,

    ich bin gerade dabei einen neuen Sortier-Algorithmus zu entwickeln, er ist noch nicht ganz fertig, aber wenn er fertig ist, werde ich den in die open-source-WELT hinaus brüllen, damit keiner von den Software-Patent-Haien auf die Idee kommt, das gehöre Ihmsen.

    --
     
  8. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
Thema:

Problem mit strok

Die Seite wird geladen...

Problem mit strok - Ähnliche Themen

  1. Virtualboxproblem

    Virtualboxproblem: Hallo Folgnedes Problem: Ich kann ohne Probleme In Debian-Sid, 64Bit und virtualbox-dkms Unixoide installieren, wenn es sich um eine...
  2. grub-pc Probleme bei upgrade

    grub-pc Probleme bei upgrade: Hallo, ich habe beim dist-upgrade folgendes Problem: ---------- Nach dieser Operation werden 0 B Plattenplatz zusätzlich benutzt. Trigger für...
  3. Problem bei apt-get upgrade (Kali 2.0)

    Problem bei apt-get upgrade (Kali 2.0): Hi, seit paar Tagen habe ich einige Probs. Dachte es sei mal an der Zeit für ein Update und nun tauchen da einige Fehler auf: Es müssen noch 0 B...
  4. Probleme mit YUM

    Probleme mit YUM: Hallo, ich habe CentOs 7 als Dualboot mit Windows 7 auf einen Dell Latitude E5510 installiert. Dies hat soweit auch alles geklappt. Leider habe...
  5. Problem mit Win-Zugriff auf SAMBA

    Problem mit Win-Zugriff auf SAMBA: Hallo rundherum, vielleicht hat jemand eine Idee... Habe jetzt schon 1 1/2 Tage damit verbraten und den Fehler nicht gefunden. Problem:...