sprintf kletar ihop alla värden i en enda sträng - Varför?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

sprintf kletar ihop alla värden i en enda sträng - Varför?

Inlägg av Al_Bundy »

Nu har jag stött på något mystiskt som jag inte kan förklara.

Jag har en kod som ska skicka ut allt på en LCD. Men innan koden skickas ut så måste den får textsträngar "" i form av en pekare.

sprintf(temperature1, "%d", TEMP1);
sprintf(temperature2, "%d", TEMP2);
sprintf(temperature3, "%d", TEMP3);

Vi säger att TEMP1 = 45 och TEMP2 = 50 och TEMP3 = 60
När jag skriver ut temperature1 på min LCD så ser jag 455060 och temperature2 blir 5060 och temperature3 blir 60.

Skulle jag bara köra med sprintf(temperature1, "%d", TEMP1); och skriva ut temperature1 så fungerar det bra. Men just när jag har andra sprintf-funktioner nedan så kletas allt ihop.

Har detta med raminnet att göra på min ATmega?
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: sprintf kletar ihop alla värden i en enda sträng - Varfö

Inlägg av johano »

Hur deklarerar du variablerna temperature1, temperature2 och temperature1?
Tänk på att dessa måste peka på varsin tillräckligt stor buffer innan sprintf(), annars blir det "bort i knas".

/johan
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: sprintf kletar ihop alla värden i en enda sträng - Varfö

Inlägg av Al_Bundy »

Ja! Det var det som var problemet! För liten buffert! Jag som tyckte att jag hade en rätt lämplig buffert.
Hur är det med de där buffert? Visst är det bättre att ha för stor, än precis?

Det fungerar nu! Tack för du påminnde mig om detta! :) :tumupp:

Om jag ska få plats med ett tal som har storleken mellan 10 och 99. Hur stor buffert ska man ha då?
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46974
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: sprintf kletar ihop alla värden i en enda sträng - Varfö

Inlägg av TomasL »

Hur är det med de där buffert? Visst är det bättre att ha för stor, än precis?
Nja, bufferten måste minst vara så stor så att variabeln får plats.
Den behöver (och skall egentligen inte vara större).
Användarvisningsbild
bit96
Inlägg: 2529
Blev medlem: 3 september 2007, 10:04:29
Ort: Säffle

Re: sprintf kletar ihop alla värden i en enda sträng - Varfö

Inlägg av bit96 »

Normalt skall du ha plats för 3 tecken om talet ligger mellan 00 och 99.
D.v.s. två siffror och noll-tecknet som markerar 'slut på strängen'.

Noll-tecknet talar om för C var texten slutar, d.v.s. var utskriften stoppar.
Det finns ingen annan information som talar om hur lång en sträng är.

Ev. kan ett tal inledas med ett blanksteg för att få plats med plustecken, minustecken, ett eller flera blanksteg, högerjustering, blanksteg istället för plustecken o.s.v.
Detta går dock att styra genom att sätta olika tecken ihop med %d, t.ex. % d, %5d, %-5d, o.s.v.

Edit: förtydligande om %d
Senast redigerad av bit96 6 februari 2015, 16:10:57, redigerad totalt 2 gånger.
svanted
Inlägg: 5280
Blev medlem: 30 augusti 2010, 21:20:38
Ort: Umeå

Re: sprintf kletar ihop alla värden i en enda sträng - Varfö

Inlägg av svanted »

menar du tal eller siffror(ASCII sträng), du använder ju "sprintf" som skriver strängar,,
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46974
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: sprintf kletar ihop alla värden i en enda sträng - Varfö

Inlägg av TomasL »

Jo, men, det beror ju på hur variablerna är deklarerade, och vilka formatsträngar som används.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: sprintf kletar ihop alla värden i en enda sträng - Varfö

Inlägg av Al_Bundy »

svanted skrev:menar du tal eller siffror(ASCII sträng), du använder ju "sprintf" som skriver strängar,,
I detta fall måste jag konvertera om t.ex. 1 till "1" i from av char-pekare då biblioteket U8GLIB vill ha det så.
TomasL skrev:
Hur är det med de där buffert? Visst är det bättre att ha för stor, än precis?
Nja, bufferten måste minst vara så stor så att variabeln får plats.
Den behöver (och skall egentligen inte vara större).
Okej.
bit96 skrev:Normalt skall du ha plats för 3 tecken om talet ligger mellan 00 och 99.
D.v.s. två siffror och noll-tecknet som markerar 'slut på strängen'.

Noll-tecknet talar om för C var texten slutar, d.v.s. var utskriften stoppar.
Det finns ingen annan information som talar om hur lång en sträng är.

Ev. kan ett tal inledas med ett blanksteg för att få plats med plustecken, minustecken, ett eller flera blanksteg, högerjustering, blanksteg istället för plustecken o.s.v.
Detta går dock att styra genom att sätta olika tecken ihop med %d, t.ex. % d, %5d, %-5d, o.s.v.

Edit: förtydligande om %d
så om jag ska få plats med "talet 34" så måste jag ha 8 + 1 = 9 i buffert då mellanslag tar också upp ett tecken lika väl som \n?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: sprintf kletar ihop alla värden i en enda sträng - Varfö

Inlägg av sodjan »

Ja. Mellanslag inte bara "tar upp" ett tecken, det *är*
ett tecken precis som alla andra. Ingen som helst skillnad...
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: sprintf kletar ihop alla värden i en enda sträng - Varfö

Inlägg av Al_Bundy »

Okej, tack då vet jag! :)
Mr Andersson
Inlägg: 1409
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: sprintf kletar ihop alla värden i en enda sträng - Varfö

Inlägg av Mr Andersson »

Al_Bundy skrev:så om jag ska få plats med "talet 34" så måste jag ha 8 + 1 = 9 i buffert då mellanslag tar också upp ett tecken lika väl som \n?
Du har ju inget \n i den strängen. Däremot har du ett "osynligt" \0 i slutet, så ja det behövs 9 tecken. Om du också ska ha med \n så blir det 10.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46974
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: sprintf kletar ihop alla värden i en enda sträng - Varfö

Inlägg av TomasL »

Al, om du hade läst i dina "hjälp-filer" hade du förstått hur sprintf fungerar.
Användarvisningsbild
tecno
Inlägg: 27252
Blev medlem: 6 september 2004, 17:34:45
Skype: tecnobs
Ort: Sparreholm, Södermanland N 59° 4.134', E 16° 49.743'
Kontakt:

Re: sprintf kletar ihop alla värden i en enda sträng - Varfö

Inlägg av tecno »

Varför skulle han frångå sina principer att inte läsa på?
opatagio
Inlägg: 236
Blev medlem: 24 maj 2005, 20:19:21

Re: sprintf kletar ihop alla värden i en enda sträng - Varfö

Inlägg av opatagio »

Använda snprintf istället?

:shock:
svanted
Inlägg: 5280
Blev medlem: 30 augusti 2010, 21:20:38
Ort: Umeå

Re: sprintf kletar ihop alla värden i en enda sträng - Varfö

Inlägg av svanted »

TomasL skrev:Jo, men, det beror ju på hur variablerna är deklarerade, och vilka formatsträngar som används.
ja men det är aldrig ett tal i ordets bemärkelse utan en text eller en sträng...
Skriv svar