|
| 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.
| |
|
|