Problem mit strok

A

alter

Grünschnabel
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!
 
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
 
Zuletzt bearbeitet:
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
 
Zuletzt bearbeitet:
@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!
 
Gerne wüsste ich auch, was Ihr so programmiert :)

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 ;)
 
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.

--
 

Ähnliche Themen

C Code Hilfe!!! gesucht bei Dezimalzahl in Binärzahl for loop

Unix Webserver mit HTML Seite erstellen

String auf Konsole ausgeben

GCC liefert in Eclipse Kompilierfehler

Prozesskommunikation mit PIPES - wie funktioniert das?

Zurück
Oben