Saturday, 17 August 2013

Íèøòî ïîñåáíî, Ïðîåêò Ìàðòèí Ìèêðîñàì [on hold]

Íèøòî ïîñåáíî, Ïðîåêò Ìàðòèí Ìèêðîñàì [on hold]

Áàôåð å ïðèâðåìåíà ìåìîðè¼à çà ñêëàäèðàœå íà ïîäàòîöè, êîè áèëå èëè ÷åêààò
äà áèäàò ïðîöåñèðàíè. snprintf Safe version of sprintf(3) of that doesn't
suffer from buffer overruns.
int snprintf(char *str, size_t size, const char *format, ...)
Chapter 3. The String Formatters of Manor Farm, Part 2: Standard (or
Blindingly Elegant) Alternatives
Difficulty: 6
Our Orwellian look at the mysteries of sprintf concludes with a
comparative analysis of snprintf, std::stringstream, std::strstream, and
the nonstandard but blindingly elegant boost::lexical_cast.
Guru Question
For each of the following alternatives to sprintf, compare and contrast
its strengths and weaknesses, using the analysis and example code from
Item 2:
snprintf std::stringstream std::strstream boost::lexical_cast
snprintf Áåçáåäíà âåðçè¼à íà sprintf(), êàêî âëåçåí ïàðàìåòàð ïðèìà è
ãîëåìèíà íà áàôåðîò ñî øòî ñå èçáåãíóâà íåãîâî ïðåïîëíóâàœå. Äîêîëêó èìàìå
ñòðèíã ñî ïîâåå êàðàêòåðè îä áàôåðîò, òèå ñå èçîñòàâààò, íî ñå áðî¼àò âî
return äåëîò íà ôóíêöè¼àòà. Íóë êàðàêòåð ñå äîäàâà àâòîìàòñêè äî
ïîñëåäíèîò êàðàêòåð. Ïîñëå format, ñå âíåñóâààò îíîëêó àðãóìåíòè êîëêó øòî
ñå ïîòðåáíè âî format.
int snprintf(char *str, size_t size, const char *format, ...)
if(buflen > 0) {
_snprintf(buf, buflen-1, "%4d", i);
buf[buflen-1] = '\0';
}
Standard? Yes: [C99] only, but will likely also be in C++0x
Easy to use, good code clarity? Yes Efficient, no extra allocation? Yes
Length-safe? Yes Type-safe? No
Usable in template? No Çàêëó÷îê: Íå ãî êîðèñòåòå sprintf.
std::stringstream
Äîñòà ïîçíàòà áèáëèîòåêà çà ïðåòâîðàœå íà ïîäàòîê âî ñòðèíã å è
stringstream. Ïðèìåð êàêî å èçãëåäà åäíî ïðåòâîðàœå ñî ostringstream.
ostringstream temp;
temp << setw(4) << i;
s = temp.str();
Ëåñíî çà êîðèñòåœå è ¼àñåí êîä? Îä åäíà ëèíè¼à êîä âî sprintf, îâäå èìàìå
3, èñòî òàêà íè å ïîòðåáíà è ïðèâðåìåíà ïðîìåíëèâà. Îäãîâîð: Íå
Åôèêàñíîñò, íåìà äîïîëíèòåëíà àëîêàöè¼à?
Íå êîðèñòè ïðåäåôèíèðàí áàôåð, òóêó êðåèðà ñâîè ïðèâðåìåí, ñî øòî ïðàâè
äîïîëíèòåëíà àëîêàöè¼à íà ìåìîðè¼à, íà ðàçëè÷íè êîìïà¼ëåðè àëîöèðà
ðàçëè÷íî ìåìîðè¼à îä 2 äî 3 ïàòè. Îäãîâîð: Íå Áåçáåäåíà äîëæèíà? Áèä弝è
àâòîìàòñêè àëîöèðà ìåìîðè¼à, áàôåðîò ñå çãîëåìóâà ïî ïîòðåáà. Îäãîâîð: Äà
Áåçáåäåí òèï? Êîðèñòåœåòî íà îïåðàòîðîò << è ï ïðåîïòîâàðóâàœå íà
ðåçóëòàòîò ñåêîãàø ãî äàâà ïðàâèîò òèï íà ïîäàòîê. Îäãîâîð: Äà
Alternative #3: std::strstream Stream class to operate on strings. Objects
of this class use a string buffer that contains a sequence of characters.
This sequence of characters can be accessed directly as a string object,
using member str. Íå ñå êîðèñòè êîëêó ïðåòõîäíèòå ïðèìåðè, íî áèä弝è å
ñòàíäàðä å ¼à ðàãëåäàìå.
ostrstream temp(buf, buflen);
temp << setw(4) << i << ends;
Ëåñíî çà êîðèñòåœå è ¼àñåí êîä? Îä åäíà ëèíè¼à êîä âî sprintf, îâäå èìàìå
3, èñòî òàêà íè å ïîòðåáíà è ïðèâðåìåíà ïðîìåíëèâà. Ñëè÷íî êàêî è
stringstream.
Îäãîâîð: Íå Åôèêàñíîñò, íåìà äîïîëíèòåëíà àëîêàöè¼à?
Íå êîðèñòè ïðåäåôèíèðàí áàôåð, òóêó êðåèðà ñâîè ïðèâðåìåí, ñî øòî ïðàâè
äîïîëíèòåëíà àëîêàöè¼à íà ìåìîðè¼à. Îäãîâîð: Íå Áåçáåäåíà äîëæèíà? Áèä弝è
àâòîìàòñêè àëîöèðà ìåìîðè¼à, áàôåðîò ñå çãîëåìóâà ïî ïîòðåáà. Îäãîâîð: Äà
Áåçáåäåí òèï? Êîðèñòåœåòî íà îïåðàòîðîò << è ï ïðåîïòîâàðóâàœå íà
ðåçóëòàòîò ñåêîãàø ãî äàâà ïðàâèîò òèï íà ïîäàòîê. Îäãîâîð: Äà

No comments:

Post a Comment