Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Speicherzugriffsfehler

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ] [ 3 ]
000
22.11.2003, 22:56 Uhr
~Alfred
Gast


Hi,

ich möchte eine url in einen Hostnamen und einen Pfad aufteilen.
Der folgenden Funktion wird deshalb die url übergeben.
z.B. www.beispiel.de/hallo
Im Pfad (Variable path) soll dann "/hallo" und in der Variablen host "www.beispiel.de" stehen. Ich bekomme leider immer bei der folgenden Funktion einen Speicherzugriffsfehler. Ich arbeite mit dem gcc-Compiler unter Linux. Ich möchte nur C verwenden und gerne erfahren, warum meine Version nicht funktioniert.
Den Pfad bekomme ich noch richtig raus. Aber beim Host bekomme ich einen Speicherzugriffsfehler. Irgendwas mache ich wohl bei dem memcpy falsch.


C++:
void urlparser (char* url, char* host, char* path)
{
    path = strstr(url,"/");
    memcpy(host, url, strlen(url) - strlen(path));

    printf("%s\n",host);
    printf("%s\n",path);
}



Ich hoffe, dass ihr mir helfen könnt.

mfg

Alfred

Dieser Post wurde am 22.11.2003 um 23:08 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
22.11.2003, 23:04 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Also bei klappt es (zumindest ohne Zugriffsverletzung )

Wie rufst du die Funktion denn auf und wie hast du die Variablen deklariert die du ihr übergibst?

Achso, du solltest strcpy() anstatt memcopy() nehmen, oder du mußt deinem String noch ein '\0' anfügen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
22.11.2003, 23:06 Uhr
~Alfred
Gast


Also, meine main sieht so aus:


C++:
int main (int argc, char* argv[])
{
char* url = argv[1];
char* host;
char* path;
urlparser(url, host, path);
}



mfg

Dirk

Dieser Post wurde am 22.11.2003 um 23:08 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
22.11.2003, 23:14 Uhr
Pablo
Supertux
(Operator)



C++:
#include <stdio.h>


void urlparser (char* url, char* host, char* path)
{
    path = strstr(url,"/");
    memcpy(host, url, strlen(url) - strlen(path));

    printf("%s\n",host);
    printf("%s\n",path);
}

int main (int argc, char* argv[])
{
    char* url = argv[1];
    char host[4029];
    char path[4029];
    urlparser(url, host, path);
        return 0;
}


--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
22.11.2003, 23:18 Uhr
~Alfred
Gast


Hi,

inzwischen kenne ich das Problem, denke ich. Wenn ich host als z.B. char host[100] definiere, dann klappt es einigermassen. Denn dann ist Speicherplatz schon da. Wenn ich aber host als char* deklariere, dann ist kein Speicherplatz reserviert, in den ich später hineinkopieren will.

@Pablo: Wenn ich char host[] schreibe, dann bekomme ich eine Fehlermeldung, dass ich die Größe angeben soll. Ich denke, dass man die eckigen Klammern nur leerlassen kann, wenn man das char-Array dann auch gleich initialisiert.

@Guybrush: strcpy kann man anscheinend nur mit 2 Parametern benutzen. Und die Größe muss ich ja auch noch angeben. Ich habe dann mal strncpy benutzt. Hat aber irgendwie nicht ganz geklappt.

Mir wäre es wirklich am liebsten, wenn ich alles mit Zeigern lösen könnte und nicht in der main ein Array deklariere.

Wie muss die Funktion urlparser() lauten, wenn ich in der main die Variable host als char* deklariere?

mfg

Alfred
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
22.11.2003, 23:24 Uhr
Pablo
Supertux
(Operator)



Zitat:
~Alfred postete
Hi,

inzwischen kenne ich das Problem, denke ich. Wenn ich host als z.B. char host[100] definiere, dann klappt es einigermassen. Denn dann ist Speicherplatz schon da. Wenn ich aber host als char* deklariere, dann ist kein Speicherplatz reserviert, in den ich später hineinkopieren will.



Guck genau, was ich schon gepostet habe.
Das Problem mit char* ist, dass du keinen richtigen Speicher deklariert hast. Wenn du aber das umgehen willst und nur mit Pointers arbeiten willst, dann solltest du mit malloc arbeiten. Gib mir 30 Min. Zeit und ich schaff das.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
22.11.2003, 23:25 Uhr
~Alfred
Gast


@Pablo: Vielen Dank. Deine Lösung habe ich jetzt mal ausprobiert. Aber die binäre Null fehlt noch am Schluss von der host-Variablen. Denn es werden nach dem Hostnamen noch komische Zeichen angezeigt.
Wenn man diese Zeile noch einfügt, dann klappt es.

Code:
host[strlen(url) - strlen(path)]='\0';



Gut, diese Lösung klappt jetzt. Aber wie könnte ich es realisieren, wenn ich in der main die host-Variable als char* deklarieren würde?

mfg

Alfred
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
22.11.2003, 23:32 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


wenn du nur ein char nimmst musst du speicher allokieren
in c mit malloc in c++ mit new

C++:
char *mycharpointer=(char*)malloc(100*sizeof(char));
...//mit dem speicher arbeiten
free(mycharpointer);//am ende nicht vergessen den speicher wieder freizugeben
//in c++ ist angenehmer
char *mycharpointer=new char[100];
...//mit dem speicher arbeiten
delete [] mycharpointer;



wenn du c++ verwendest nimm lieber ein std::string
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
22.11.2003, 23:47 Uhr
~Alfred
Gast


Hi Windalf,

vielen Dank für deine Antwort. Das werde ich jetzt gleich ausprobieren.

mfg

Alfred
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
22.11.2003, 23:49 Uhr
Pablo
Supertux
(Operator)



C++:
#include <stdio.h>
#include <malloc.h>


int where(char c, const char* buffer)
{
    int i,j=strlen(buffer);
    for(i=0; i<j && buffer[i] != c; ++i);
    return i;
}

int main (int argc, char* argv[])
{
    char* url = argv[1];
    char* temp = url;
    char* host;
    char* path;
    int pos = where('/', temp),i,j,len=strlen(url);
    if ( (host = (char*) malloc(pos)) == NULL ) {
        printf("Kein Speicher mehr.\n");
        return 1;
    }
    if ( (path = (char*) malloc(len-pos+1)) == NULL ) {
        printf("Kein Speicher mehr.\n");
        return 1;
    }
    
    for(i=0; i<pos; ++i)
        host[i] = *(url++);
    host[i]=0;
    for(j=i; j<len; ++j)
        path[j-pos-1] = *(url++);
    path[j-pos]=0;

    
    printf("%s\n",host);
    printf("%s\n",path);    
    
    free(host);
    free(path);
    
    return 0;

}



Wie wäre es damit?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: