/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
problemer med strncpy
Fra : Ukendt


Dato : 31-05-04 11:10

Jeg har en char buffer der indeholder en tekststreng sendt fra en client til
en server - jeg skal have fat i tegnet umiddelbart efter "userid=", og
bruger nedenstående kode - det virker fint i compilet med bcb og kørt i
windows, men i mit linux miljø vil den ikke godtage 'strncpy(userid,
pointer2, 1)' - der får jeg en segmentationfault på min server - er der en
enden måde at få værdien kopieret ned i 'userid' ???

char buffer[10000], buffer2[100], userid[100];
int uid;

sprintf(buffer2, "userid=");
pointer = strstr(buffer, buffer2);
pointer2 = pointer + strlen(buffer2);
//strncpy(userid, pointer2, 1);
uid = atoi(userid);



 
 
Kent Friis (31-05-2004)
Kommentar
Fra : Kent Friis


Dato : 31-05-04 11:17

Den Mon, 31 May 2004 12:09:53 +0200 skrev skovge:
> Jeg har en char buffer der indeholder en tekststreng sendt fra en client til
> en server - jeg skal have fat i tegnet umiddelbart efter "userid=", og
> bruger nedenstående kode - det virker fint i compilet med bcb og kørt i
> windows, men i mit linux miljø vil den ikke godtage 'strncpy(userid,
> pointer2, 1)' - der får jeg en segmentationfault på min server - er der en
> enden måde at få værdien kopieret ned i 'userid' ???
>
> char buffer[10000], buffer2[100], userid[100];
> int uid;
>
> sprintf(buffer2, "userid=");
> pointer = strstr(buffer, buffer2);
> pointer2 = pointer + strlen(buffer2);
> //strncpy(userid, pointer2, 1);
> uid = atoi(userid);

strncpy(3):

The strncpy() function is similar, except that not more
   than n bytes of src are copied. Thus, if there is no null
   byte among the first n bytes of src, the result wil not be
   null-terminated.

Det er nok nærmere atoi() der segfaulter ved at forsøge at læse til
\0 i userid, som ikke indeholder \0.

Mvh
Kent
--
Help test this great MMORPG game - http://www.eternal-lands.com/

Byrial Jensen (31-05-2004)
Kommentar
Fra : Byrial Jensen


Dato : 31-05-04 11:32

skovge wrote:
> Jeg har en char buffer der indeholder en tekststreng sendt fra en client til
> en server - jeg skal have fat i tegnet umiddelbart efter "userid=", og
> bruger nedenstående kode - det virker fint i compilet med bcb og kørt i
> windows, men i mit linux miljø vil den ikke godtage 'strncpy(userid,
> pointer2, 1)' - der får jeg en segmentationfault på min server - er der en
> enden måde at få værdien kopieret ned i 'userid' ???
>
> char buffer[10000], buffer2[100], userid[100];
> int uid;
>
> sprintf(buffer2, "userid=");
> pointer = strstr(buffer, buffer2);
> pointer2 = pointer + strlen(buffer2);
> //strncpy(userid, pointer2, 1);

Denne sætning ville hvis den ikke var udkommenteret, kopiere 1 tegn til
userid. Det vil sige at den præcis svarer til hvis der havde stået
"userid[0] = pointer2[0]".

> uid = atoi(userid);

Dette vil forsøge at konvertere indholdet af userid til en integer. Men
indholdet af userid er udefineret på nær det første tegn, så du
risikerer bufferoverløb her.

Hvis uid altid er på ét ciffer, kunne du gøre noget i retning af
(advarsel: utestet kode):
if (const char *res = strstr (buffer, "userid="))
{
res += strlen ("userid=");
uid = *res - '0';
}

Søg
Reklame
Statistik
Spørgsmål : 177459
Tips : 31964
Nyheder : 719565
Indlæg : 6408176
Brugere : 218881

Månedens bedste
Årets bedste
Sidste års bedste