Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.c > #163448
| From | Manfred <noname@add.invalid> |
|---|---|
| Newsgroups | comp.lang.c |
| Subject | Re: Automatic strings without malloc |
| Date | 2021-11-17 18:19 +0100 |
| Organization | Aioe.org NNTP Server |
| Message-ID | <sn3dim$1li1$1@gioia.aioe.org> (permalink) |
| References | <sn2lvp$sl7$1@dont-email.me> <sn2nk2$7mp$1@dont-email.me> |
On 11/17/2021 12:04 PM, David Brown wrote: > On 17/11/2021 11:36, pozz wrote: >> Many times I need to construct a string through a call to sprintf and >> pass it to an external function. >> >> char s[32]; >> sprintf(s, "Hi %s, today is %d/%d/%d", yourname, day, month, year); >> lcd_write(s); >> >> The size of s is fixed and calculated for the maximum length of >> yourname, that is 9. >> >> Later in time, I need to change the message into: >> >> sprintf(s, "Hello %s, today is %d/%d/%d", yourname, day, month, year); >> >> Of course, I need to re-calculate the worst-case length, that should be >> now 35. However this is error-prone and I could forget to change the >> size of array. >> >> Is there a better way to manage this situation? I can't use malloc() >> because I'm on an embedded system where I can't use heap. >> >> I'm thinking to use sprintf(NULL, ...), such as: >> >> const char fmt[] = "Hi %s, today is %d/%d/%d"; >> size_t n = sprintf(NULL, fmt, yourname, day, month, year); >> char s[n + 1]; >> sprintf(s, fmt, yourname, day, month, year); >> lcd_write(s); >> > > That would work (with your follow-up correction). You might want to put > a limit on "n" to avoid accidental stack overflow. This arrangement > does mean that you are doing the printf part twice. > > Very often in small systems you know there is a maximum size - if your > screen is 40 characters wide, then 40 characters is enough in your > array. And if you might need up to 40 characters then you might as well > use all of the 40 chars, even though your string might be shorter - you > really don't want to test your code for the name "Al" on date 1/2/2021 > and then find you have a stack overflow on 10/10/2021 with the name > "Rhoshandiatellyneshiaunneveshenk". (Apparently that's a real name - > according to google!) This sounds like good advice. It makes sense to make use of the information given by the maximum string length that can actually be emitted. I'd add the following: 1) use snprintf instead of sprintf; the former is explicitly designed to handle the buffer size limit. 2) use a better format specifier instead of plain "%s" for the string argument, e.g. "%2.12s" Both of the above help preventing buffer overflow, which is something you need to ensure it never happens.
Back to comp.lang.c | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
Automatic strings without malloc pozz <pozzugno@gmail.com> - 2021-11-17 11:36 +0100
Re: Automatic strings without malloc pozz <pozzugno@gmail.com> - 2021-11-17 11:38 +0100
Re: Automatic strings without malloc Malcolm McLean <malcolm.arthur.mclean@gmail.com> - 2021-11-17 03:00 -0800
Re: Automatic strings without malloc David Brown <david.brown@hesbynett.no> - 2021-11-17 12:04 +0100
Re: Automatic strings without malloc Manfred <noname@add.invalid> - 2021-11-17 18:19 +0100
Re: Automatic strings without malloc David Brown <david.brown@hesbynett.no> - 2021-11-17 20:34 +0100
Re: Automatic strings without malloc pozz <pozzugno@gmail.com> - 2021-11-18 10:07 +0100
Re: Automatic strings without malloc Thiago Adams <thiago.adams@gmail.com> - 2021-11-17 05:11 -0800
Re: Automatic strings without malloc Philipp Klaus Krause <pkk@spth.de> - 2021-11-18 15:29 +0100
Re: Automatic strings without malloc Bart <bc@freeuk.com> - 2021-11-17 13:47 +0000
Re: Automatic strings without malloc scott@slp53.sl.home (Scott Lurndal) - 2021-11-17 15:34 +0000
Re: Automatic strings without malloc Malcolm McLean <malcolm.arthur.mclean@gmail.com> - 2021-11-17 07:36 -0800
Re: Automatic strings without malloc David Brown <david.brown@hesbynett.no> - 2021-11-17 16:56 +0100
Re: Automatic strings without malloc scott@slp53.sl.home (Scott Lurndal) - 2021-11-17 18:21 +0000
Re: Automatic strings without malloc David Brown <david.brown@hesbynett.no> - 2021-11-17 20:37 +0100
Re: Automatic strings without malloc scott@slp53.sl.home (Scott Lurndal) - 2021-11-17 21:35 +0000
Re: Automatic strings without malloc Thiago Adams <thiago.adams@gmail.com> - 2021-11-19 05:38 -0800
Re: Automatic strings without malloc Malcolm McLean <malcolm.arthur.mclean@gmail.com> - 2021-11-19 07:13 -0800
Re: Automatic strings without malloc William Ahern <william@25thandClement.com> - 2021-11-17 20:46 -0800
Re: Automatic strings without malloc David Brown <david.brown@hesbynett.no> - 2021-11-18 10:50 +0100
Re: Automatic strings without malloc Malcolm McLean <malcolm.arthur.mclean@gmail.com> - 2021-11-18 03:56 -0800
Re: Automatic strings without malloc Thiago Adams <thiago.adams@gmail.com> - 2021-11-18 05:54 -0800
Re: Automatic strings without malloc Ben Bacarisse <ben.usenet@bsb.me.uk> - 2021-11-18 16:38 +0000
Re: Automatic strings without malloc Thiago Adams <thiago.adams@gmail.com> - 2021-11-18 10:52 -0800
Re: Automatic strings without malloc Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2021-11-18 11:27 -0800
Re: Automatic strings without malloc Ben Bacarisse <ben.usenet@bsb.me.uk> - 2021-11-18 20:41 +0000
Re: Automatic strings without malloc David Brown <david.brown@hesbynett.no> - 2021-11-18 16:05 +0100
Re: Automatic strings without malloc Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2021-11-17 11:22 -0800
Re: Automatic strings without malloc David Brown <david.brown@hesbynett.no> - 2021-11-17 20:39 +0100
Re: Automatic strings without malloc Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2021-11-17 15:18 -0800
[OT] Generally... [Was: Automatic strings without malloc] Jeremy Brubaker <jbrubake@orionarts.invalid> - 2021-11-18 17:46 +0000
Re: [OT] Generally... [Was: Automatic strings without malloc] Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2021-11-18 11:21 -0800
Re: Automatic strings without malloc Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2021-11-17 11:14 -0800
Re: Automatic strings without malloc pozz <pozzugno@gmail.com> - 2021-11-18 10:08 +0100
Re: Automatic strings without malloc Siri Cruise <chine.bleu@yahoo.com> - 2021-11-18 12:25 -0800
Re: Automatic strings without malloc David Brown <david.brown@hesbynett.no> - 2021-11-18 23:19 +0100
Re: Automatic strings without malloc Siri Cruise <chine.bleu@yahoo.com> - 2021-11-18 17:22 -0800
Re: Automatic strings without malloc Malcolm McLean <malcolm.arthur.mclean@gmail.com> - 2021-11-19 01:46 -0800
Re: Automatic strings without malloc David Brown <david.brown@hesbynett.no> - 2021-11-19 17:29 +0100
Re: Automatic strings without malloc David Brown <david.brown@hesbynett.no> - 2021-11-19 17:26 +0100
Re: Automatic strings without malloc Siri Cruise <chine.bleu@yahoo.com> - 2021-11-19 09:00 -0800
Re: Automatic strings without malloc David Brown <david.brown@hesbynett.no> - 2021-11-19 18:25 +0100
Re: Automatic strings without malloc "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2021-11-19 14:58 -0800
Re: Automatic strings without malloc Guillaume <message@bottle.org> - 2021-11-19 19:37 +0100
Re: Automatic strings without malloc "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2021-11-19 12:34 -0800
Re: Automatic strings without malloc Malcolm McLean <malcolm.arthur.mclean@gmail.com> - 2021-11-19 13:44 -0800
Re: Automatic strings without malloc David Brown <david.brown@hesbynett.no> - 2021-11-20 13:30 +0100
Re: Automatic strings without malloc luser droog <luser.droog@gmail.com> - 2021-11-20 20:49 -0800
csiph-web