/ 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
newbie, strings problem
Fra : Leif Neland


Dato : 13-09-05 07:26

Det er vist for mange år siden, jeg har lavet c...

Jeg vil gerne konkatenere nogle tal til en streng.

char resbuffer[200]; // Sæt plads af
resbuffer[0] = 0; // Clear buffer
....
for (...) {
....
resbuffer=sprintf("%s:%0.1f", resbuffer,current_temp); /* error:
incompatible types in assignment */
....
}


Det kan da ikke være så svært...

Leif



 
 
N/A (13-09-2005)
Kommentar
Fra : N/A


Dato : 13-09-05 18:42



Arne Vajhøj (13-09-2005)
Kommentar
Fra : Arne Vajhøj


Dato : 13-09-05 18:42

Bertel Lund Hansen wrote:
> Leif Neland skrev:
>>resbuffer=sprintf("%s:%0.1f", resbuffer,current_temp); /* error:
>>incompatible types in assignment */

>    sprintf(resbuffer,"%s:%0.1f", resbuffer, current_temp);
>
> Tricket er at man angiver resbuffer både som target og som
> værdiparameter.

I det konkrete tilfælde er jeg ret overbevist om at
det virker.

Men generelt vil jeg være lidt forsigtig med at have
resultat strengen som værdi argument også.

Arne

Bertel Brander (13-09-2005)
Kommentar
Fra : Bertel Brander


Dato : 13-09-05 18:50

Arne Vajhøj wrote:
>> sprintf(resbuffer,"%s:%0.1f", resbuffer, current_temp);
>>
>> Tricket er at man angiver resbuffer både som target og som
>> værdiparameter.
>
>
> I det konkrete tilfælde er jeg ret overbevist om at
> det virker.
>
> Men generelt vil jeg være lidt forsigtig med at have
> resultat strengen som værdi argument også.

Ja, i C-standarden står der om sprintf:
"If copying takes place between objects that overlap,
the behavior is undefined."

I dette tilfælde vil det måske/sansynligvis virke, men hvis man
ændrer format strengen til f.ex: ">%s:%0.1f" vil det sansynligvis
fejle.

--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Bertel Lund Hansen (13-09-2005)
Kommentar
Fra : Bertel Lund Hansen


Dato : 13-09-05 20:53

Bertel Brander skrev:

> Ja, i C-standarden står der om sprintf:
> "If copying takes place between objects that overlap,
> the behavior is undefined."

Åh, det havde jeg glemt. Så skal man omkring en buffer:
   ...
   char buffer[200];

   ...
   sprintf(buffer,"%s:%0.1f", resbuffer, current_temp);
   sprintf(resbuffer,buffer);

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Arne Vajhøj (13-09-2005)
Kommentar
Fra : Arne Vajhøj


Dato : 13-09-05 21:11

Bertel Lund Hansen wrote:
> Bertel Brander skrev:
>>Ja, i C-standarden står der om sprintf:
>>"If copying takes place between objects that overlap,
>>the behavior is undefined."
>
> Åh, det havde jeg glemt. Så skal man omkring en buffer:
>    ...
>    char buffer[200];
>
>    ...
>    sprintf(buffer,"%s:%0.1f", resbuffer, current_temp);
>    sprintf(resbuffer,buffer);

strcpy I presume ...

Arne

Kent Friis (13-09-2005)
Kommentar
Fra : Kent Friis


Dato : 13-09-05 22:15

Den Tue, 13 Sep 2005 21:53:25 +0200 skrev Bertel Lund Hansen:
> Bertel Brander skrev:
>
>> Ja, i C-standarden står der om sprintf:
>> "If copying takes place between objects that overlap,
>> the behavior is undefined."
>
> Åh, det havde jeg glemt. Så skal man omkring en buffer:
>    ...
>    char buffer[200];
>
>    ...
>    sprintf(buffer,"%s:%0.1f", resbuffer, current_temp);
>    sprintf(resbuffer,buffer);

Format string exploit :-þ

resbuffer="%s"
current_temp=0.0

> sprintf(buffer,"%s:%0.1f", resbuffer, current_temp);

Nu er buffer="%s:.0"

> sprintf(resbuffer,buffer);

sprintf(resbuffer, "%s":.0); /* hvor peger den tredje parameter på
stakken henad? */

I dette tilfælde er strcpy en nemmere løsning, og ellers: Brug aldrig
en streng brugeren har indflydelse på indholdet af som format til
*printf.

Mvh
Kent
--
Hard work may pay off in the long run, but laziness pays off right now.

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408914
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste