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; }
Annonceindlæg fra DE-CIX
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
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...
Prøv og erstat den første strcat med strcpy.
Og nu kan du godt bruge: delete pSQL; (fordi PSQL statigvæk peger på det oprindelige new'et)
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?
Det gør den vel også. strcpy er en = og strcat er en +
Men jeg har en voldsom mistanke om at dit problem kan gribes lidt anderledes an. Hvad indeholder oneline og hvad skal pSQL indeholde ?
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
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; }
Ikke helt så elegant, men nogenlunde overskueligt. [bare tastet ind så check lige for fejl]
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')
PS: Jeg håber du bruger ODBC og ikke et af de database specifikke libraries.
Uha uha det ser ud til at være guf :-D Jeg undersøger sagen... (skal lige lure din kode først)
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')
Manner manner manner - det virker jo glimragende :-D Tak for hjælpen
Kurser inden for grundlæggende programmering