Avatar billede repsak Nybegynder
17. maj 2003 - 18:30 Der er 14 kommentarer og
1 løsning

pointer problem...

Hey er der nogle som kan lure hvorfor denne kode ikke kan exekveres uden fejl?

void Format(char * oneLine){
    char * pToken = strtok(oneLine,",");
    char * pSQL = new char[150];

    pSQL = "INSERT INTO medlemmer VALUES('";

    strcpy (pSQL,pToken);
    strcat (pSQL,"','");
    cout << pSQL;
    delete pToken;
    delete pSQL;
}
Avatar billede arne_v Ekspert
17. maj 2003 - 18:35 #1
Der er flere suspekte ting:

1)

char * pSQL = new char[150];
pSQL = "INSERT INTO medlemmer VALUES('";

allokerer først 150 byte og så overskriver den pointeren til dem
(så der ikke længere er ne pointer til dem).

Formentlig skulle det have været en strcpy.

2)

delete pToken;
delete pSQL;

pToken er ikke new'et oh kan derfor ikke delete's
pSQL peger ikke længere på noget der er new'et (se #1) og kan derfor
heller ikke delete's
Avatar billede repsak Nybegynder
17. maj 2003 - 18:42 #2
har nu prøvet:

void Format(char * oneLine){
    char * pToken = strtok(oneLine,",");
    char * pSQL = new char[150];

    strcat (pSQL,"INSERT INTO medlemmer VALUES('";

    //strcpy (pSQL,pToken);
    strcat (pSQL,pToken);
    strcat (pSQL,"','");

    pToken = strtok(NULL, ",");
    strcat (pSQL,pToken);
    strcat (pSQL,"','");

    pToken = strtok(NULL, ",");
    strcat (pSQL,pToken);
    strcat (pSQL,"','");
   

    cout << pSQL;

//    delete pToken;
//    delete pSQL;
}

men det er heller ikke godt...
Avatar billede arne_v Ekspert
17. maj 2003 - 18:44 #3
Prøv og erstat den første strcat med strcpy.
Avatar billede arne_v Ekspert
17. maj 2003 - 18:44 #4
Og nu kan du godt bruge:
  delete pSQL;

(fordi PSQL statigvæk peger på det oprindelige new'et)
Avatar billede repsak Nybegynder
17. maj 2003 - 18:50 #5
ok :-) Det er også ok, men hvordan får jeg så min SQL streng "INSERT INTO medlemmer VALUES('"; smidt ind før den første token?
Avatar billede arne_v Ekspert
17. maj 2003 - 18:55 #6
Det gør den vel også.

strcpy er en =

og strcat er en +
Avatar billede arne_v Ekspert
17. maj 2003 - 18:56 #7
Men jeg har en voldsom mistanke om at dit problem kan gribes lidt
anderledes an.

Hvad indeholder oneline og hvad skal pSQL indeholde ?
Avatar billede repsak Nybegynder
17. maj 2003 - 19:06 #8
Programmet skal læse persondata (text linjer) ind fra en fil og placere dem korrekt i en SQL sætning. Hver gang en linje er indlæst kaldes denne Format-metode. oneline er parameteren som indeholder den indlæste linje. pSQL skal være den streng som samler den endelige sql sætning. Derfor var min ide: (skriver lige i java - det er jeg bedre til (tager ikke hensyn til at StringBuffer måske er et bedre valg til java...))

String pSQL = "INSERT INTO medlemmer VALUES('"
pSQL += stringtokenizer.nextToken();
pSQL += "','";
... osv
Avatar billede arne_v Ekspert
17. maj 2003 - 19:27 #9
Jeg vil tillade mig at formode at oneLine er komma separeret.

Og jeg ville nok kode det noget i retning af:

void Format(char * oneLine){
    char *pSQL = new char[150];
    strcpy (pSQL,"INSERT INTO medlemmer VALUES('";
    int ix = strlen(pSQL);
    for(int i=0;i<strlen(oneLine);i++) {
        if(oneLine[i]==',') {
            pSQL[ix]='\'';
            ix++;
            pSQL[ix]=',';
            ix++;
            pSQL[ix]='\'';
            ix++;
        } else {
            pSQL[ix]=oneLine[i];
            ix++;
        }
    }
    pSQL[ix]='\0';
    strcat(pSQL,"')");
    cout << pSQL << endl;
    delete pSQL;
}
Avatar billede arne_v Ekspert
17. maj 2003 - 19:28 #10
Ikke helt så elegant, men nogenlunde overskueligt.

[bare tastet ind så check lige for fejl]
Avatar billede arne_v Ekspert
17. maj 2003 - 19:31 #11
Ikke så ringe endda. Der manglede vist bare en parentes.

#include <iostream>
#include <cstring>

using namespace std;

void Format(char * oneLine){
    char *pSQL = new char[150];
    strcpy (pSQL,"INSERT INTO medlemmer VALUES('");
    int ix = strlen(pSQL);
    for(int i=0;i<strlen(oneLine);i++) {
        if(oneLine[i]==',') {
            pSQL[ix]='\'';
            ix++;
            pSQL[ix]=',';
            ix++;
            pSQL[ix]='\'';
            ix++;
        } else {
            pSQL[ix]=oneLine[i];
            ix++;
        }
    }
    pSQL[ix]='\0';
    strcat(pSQL,"')");
    cout << pSQL << endl;
    delete pSQL;
}

int main() {
  Format("a,bb,ccc");
}

outputter:

INSERT INTO medlemmer VALUES('a','bb','ccc')
Avatar billede arne_v Ekspert
17. maj 2003 - 19:32 #12
PS: Jeg håber du bruger ODBC og ikke et af de database specifikke
libraries.
Avatar billede repsak Nybegynder
17. maj 2003 - 19:40 #13
Uha uha det ser ud til at være guf :-D Jeg undersøger sagen... (skal lige lure din kode først)
Avatar billede arne_v Ekspert
17. maj 2003 - 20:02 #14
Jeg prøvede lige at lave den med strtok:

#include <iostream>
#include <cstring>

using namespace std;

void Format(char * oneLine){
    char *pSQL = new char[150];
    strcpy (pSQL,"INSERT INTO medlemmer VALUES('");
    char *copy = new char[strlen(oneLine)+1];
    strcpy(copy,oneLine); // important strtok modifies the argument
    char *p = strtok(copy,",");
    strcat(pSQL,p);
    while((p=strtok(NULL,","))!=NULL) {
      strcat(pSQL,"','");
      strcat(pSQL,p);
    }
    strcat(pSQL,"')");
    cout << pSQL << endl;
    delete pSQL;
}

int main() {
  Format("a,bb,ccc");
}

den giver også:

INSERT INTO medlemmer VALUES('a','bb','ccc')
Avatar billede repsak Nybegynder
19. maj 2003 - 10:43 #15
Manner manner manner - det virker jo glimragende :-D
Tak for hjælpen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester