<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>strcpy is being deprecated????</title>
		<link>http://www.allegro.cc/forums/view/590442</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Thu, 15 Mar 2007 23:22:31 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;m continuing to work on my math parser. It was running fine on my home computer compiled with VisC++ 8.0. Since I have some free time at school, I decided to work on it there. The problem is I received alot of warnings</p><p>strcpy being deprecated use strcpy_s<br />sprintf &quot;&quot; sprintf_s</p><p>So I bit the bullet and started using std::string&#39;s. I&#39;m not too familiar with them so I need some help. How would I go about doing this with strings:</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">char</span> temp<span class="k2">[</span> <span class="n">256</span> <span class="k2">]</span> <span class="k3">=</span> <span class="s">""</span><span class="k2">;</span>
<a href="http://www.delorie.com/djgpp/doc/libc/libc_737.html" target="_blank">sprintf</a><span class="k2">(</span> temp, <span class="s">"The value is %d"</span>, value <span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

I tried this and that didn&#39;t work.
</p><div class="source-code snippet"><div class="inner"><pre>std::string temp<span class="k2">;</span>

temp <span class="k3">=</span> <span class="s">"The value is "</span> <span class="k3">+</span> value<span class="k2">;</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (DanielH)</author>
		<pubDate>Thu, 08 Mar 2007 21:40:17 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>It is a problem of MSVC. strcpy is a standard function and no other compiler depricates it besides MSVC. Ignore the warnings and keep on using strcpy if you need it.</p><p>For std::string see <a href="http://www.cppreference.com/cppstring/index.html">this</a>, especially the append member function.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (HoHo)</author>
		<pubDate>Thu, 08 Mar 2007 21:48:12 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>What about <span class="source-code"><a href="http://www.delorie.com/djgpp/doc/libc/libc_769.html" target="_blank">strncpy</a><span class="k2">(</span><span class="k2">)</span>, <a href="http://www.delorie.com/djgpp/doc/libc/libc_732.html" target="_blank">snprintf</a><span class="k2">(</span><span class="k2">)</span></span>?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (gnolam)</author>
		<pubDate>Thu, 08 Mar 2007 22:16:24 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I think Microsoft was deprecating the versions without lenght to prevent bugs.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ReyBrujo)</author>
		<pubDate>Thu, 08 Mar 2007 22:17:47 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>strcpy is being deprecated because say you have<br />char buffer[5];<br />strcpy(buffer, &quot;Oh man I&#39;m bigger than 4&quot;);</p><p>You&#39;ll start overwriting your code in memory. strcpy_s takes the size of the buffer and makes sure it&#39;s not overrun. It&#39;s a classical way hackers can take over a system - buffer overrun.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Ninkazu)</author>
		<pubDate>Thu, 08 Mar 2007 22:24:49 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>strcpy_s is a winapi specific function. strncpy would do exactly the same thing and would be cross-platform.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (HoHo)</author>
		<pubDate>Thu, 08 Mar 2007 22:28:18 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>ReyBrujo is correct with this: with the infamous AOL/MSN buffer exploits that happened so many years ago, they&#39;re trying to get away from functions that don&#39;t prevent buffer overruns.  <tt>strncpy()</tt> will read up to, but not more than, the given number.  Otherwise, you could declare a string of length 100, and if the user writes 104 or 108 bytes, then it can corrupt the stack or be used as an exploit.</p><p>I guess it&#39;s better to deprecate it to force programmers to start learning how to program &quot;safely&quot; <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (TeamTerradactyl)</author>
		<pubDate>Thu, 08 Mar 2007 22:32:41 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>HoHo</p><p>None of those deal with values in terms of int or long or ...</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">int</span> value <span class="k3">=</span> <span class="n">25</span><span class="k2">;</span>
std:string str <span class="k3">=</span> <span class="s">""</span><span class="k2">;</span>

str <span class="k3">=</span> <span class="s">"The value is "</span> <span class="k3">+</span> value<span class="k2">;</span>
</pre></div></div><p>

gives me &#39;The value is ***GARBAGE ***&#39;
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (DanielH)</author>
		<pubDate>Thu, 08 Mar 2007 22:33:28 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The C++ way to format strings is to use std::stringstream:</p><div class="source-code snippet"><div class="inner"><pre><span class="p">#include &lt;iostream&gt;</span>
<span class="p">#include &lt;sstream&gt;</span>
<span class="p">#include &lt;string&gt;</span>

<span class="k1">int</span> main<span class="k2">(</span><span class="k2">)</span>
<span class="k2">{</span>
    <span class="k1">int</span> value <span class="k3">=</span> <span class="n">25</span><span class="k2">;</span>
    std::stringstream temp<span class="k2">;</span>
    temp <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"The value is "</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> value<span class="k2">;</span>
    std::string s<span class="k2">(</span>temp.str<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
    std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> s <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">'\n'</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

The best I can do to explain, why your example compiles, is that the compiler might see this as pointer arithmetics: The first part, the string literal, is actually seen as a constant char* (which one can assign to the string). Then you add 25 to the pointer, getting another char pointer pointing 25 chars onward in the memory. Whatever happens to be there, up to the first 0 character, is copied to the string.</p><p>Hmm, so if you don&#39;t know what you are doing, std::string <i>can</i> be unsafe too... <img src="http://www.allegro.cc/forums/smileys/sad.gif" alt=":(" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (anonymous)</author>
		<pubDate>Thu, 08 Mar 2007 23:08:19 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>To do that kind of things in C++ you use <a href="http://www.cppreference.com/cppsstream/index.html">stringstream</a>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (HoHo)</author>
		<pubDate>Thu, 08 Mar 2007 23:11:10 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
I think Microsoft was deprecating the versions without lenght to prevent bugs.
</p></div></div><p>No, those are derecated, too.</p><p>And, as clearly stated in the warning, simply define <tt>_CRT_SECURE_NO_DEPRECATE</tt> to disable the warnings.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CGamesPlay)</author>
		<pubDate>Thu, 08 Mar 2007 23:53:35 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You can turn off those warnings in VS and go with the standard instead of Microsofts usual way of working against portability and standards.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kentl)</author>
		<pubDate>Thu, 08 Mar 2007 23:54:37 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
The C++ way to format strings is to use std::stringstream:
</p></div></div><p>
That, or boost::lexical_cast&lt;&gt; or boost::format&lt;&gt;.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Bob)</author>
		<pubDate>Fri, 09 Mar 2007 00:33:54 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>
Be careful with strncpy, in some situations it doesn&#39;t add terminating characters:<br /><a href="http://developer.apple.com/documentation/Darwin/Reference/Manpages/man3/strncpy.3.html">http://developer.apple.com/documentation/Darwin/Reference/Manpages/man3/strncpy.3.html</a>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Richard Phipps)</author>
		<pubDate>Fri, 09 Mar 2007 00:40:44 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>For anyone getting the deprecation warnings with msvc 8, just put this before any #includes:</p><p>#define _CRT_SECURE_NO_DEPRECATE
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (torhu)</author>
		<pubDate>Fri, 09 Mar 2007 00:44:21 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p><a href="http://www.allegro.cc/forums/thread/590442/656479#target">CGames beat you, torhu</a>. <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (BAF)</author>
		<pubDate>Fri, 09 Mar 2007 02:16:57 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I appreciate BAF for reading my posts! <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CGamesPlay)</author>
		<pubDate>Fri, 09 Mar 2007 04:58:21 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>For std::string, besides the methods already suggested, you may use:
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">template</span><span class="k3">&lt;</span><span class="k1">typename</span> T&gt;
std::string to_string<span class="k2">(</span><span class="k1">const</span> T <span class="k3">&amp;</span>value<span class="k2">)</span>
<span class="k2">{</span>
  std::ostringstream ret<span class="k2">;</span>
  ret <span class="k3">&lt;</span><span class="k3">&lt;</span> value<span class="k2">;</span>
  <span class="k1">return</span> ret.str<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

---------------------------------</p><div class="source-code snippet"><div class="inner"><pre>std::string temp<span class="k2">;</span>

temp <span class="k3">=</span> <span class="s">"The value is "</span> <span class="k3">+</span> to_string<span class="k2">(</span>value<span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Billybob)</author>
		<pubDate>Fri, 09 Mar 2007 06:08:11 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Wouldn&#39;t that be to_string&lt;value_type&gt;(value); ? Or do I not know how to use templates with functions (I&#39;ve only ever used them with classes)?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (BAF)</author>
		<pubDate>Fri, 09 Mar 2007 07:29:32 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>BAF: No, that would not be to_string&lt;value_type&gt;(value);, as the template type can be automatically determined by the arguments of the function (now, if the return type was a template parameter that isn&#39;t mentioned in the argument list, you would need to specify it that way.)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Carrus85)</author>
		<pubDate>Fri, 09 Mar 2007 07:54:19 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Make your own:</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="p">#include &lt;stdio.h&gt;</span></td></tr><tr><td class="number">2</td><td>&#160;</td></tr><tr><td class="number">3</td><td><span class="k1">char</span><span class="k3">*</span> strcopy<span class="k2">(</span><span class="k1">char</span><span class="k3">*</span> dest, <span class="k1">char</span><span class="k3">*</span> src<span class="k2">)</span></td></tr><tr><td class="number">4</td><td><span class="k2">{</span></td></tr><tr><td class="number">5</td><td>  <span class="k1">int</span> i <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">6</td><td>&#160;</td></tr><tr><td class="number">7</td><td>  <span class="k1">while</span><span class="k2">(</span>src<span class="k3">&lt;</span>i&gt;<span class="k2">)</span></td></tr><tr><td class="number">8</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">9</td><td>    dest<span class="k3">&lt;</span>i&gt; <span class="k3">=</span> src<span class="k3">&lt;</span>i&gt;<span class="k2">;</span></td></tr><tr><td class="number">10</td><td>    i<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">11</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">12</td><td>&#160;</td></tr><tr><td class="number">13</td><td>  dest<span class="k3">&lt;</span>i&gt; <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">14</td><td>&#160;</td></tr><tr><td class="number">15</td><td>  <span class="k1">return</span> dest<span class="k2">;</span></td></tr><tr><td class="number">16</td><td><span class="k2">}</span></td></tr><tr><td class="number">17</td><td>&#160;</td></tr><tr><td class="number">18</td><td><span class="k1">int</span> main<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">19</td><td><span class="k2">{</span></td></tr><tr><td class="number">20</td><td>  <span class="k1">char</span> dest<span class="k2">[</span><span class="n">10</span><span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">21</td><td>  <span class="k1">char</span> src<span class="k2">[</span><span class="k2">]</span> <span class="k3">=</span> <span class="s">"foobarbaz"</span><span class="k2">;</span></td></tr><tr><td class="number">22</td><td>&#160;</td></tr><tr><td class="number">23</td><td>  strcopy<span class="k2">(</span>dest, src<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">24</td><td>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"%s\n"</span>, dest<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">25</td><td>  </td></tr><tr><td class="number">26</td><td>  <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">27</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Paul Pridham)</author>
		<pubDate>Fri, 09 Mar 2007 09:07:24 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Be careful with strncpy, in some situations it doesn&#39;t add terminating characters:
</p></div></div><p>
Wasn&#39;t there supposed to be a new function to take care of that? strlcpy or something. I&#39;m positive I read something about that once, and it also fixed the issue of strncpy filling the rest of the destination string with null chars (a potential performance problem). I don&#39;t have it in my man pages, though..
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kitty Cat)</author>
		<pubDate>Fri, 09 Mar 2007 10:16:22 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>It&#39;s a OpenBSD (or *BSD) function.  The glibc folks don&#39;t like it.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Peter Wang)</author>
		<pubDate>Fri, 09 Mar 2007 11:14:33 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="source-code snippet"><div class="inner"><pre><span class="k1">char</span><span class="k3">*</span> strcopy<span class="k2">(</span><span class="k1">char</span><span class="k3">*</span> dest, <span class="k1">char</span><span class="k3">*</span> src<span class="k2">)</span>
<span class="k2">{</span>
  <span class="k1">int</span> i <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>

  <span class="k1">while</span><span class="k2">(</span>src<span class="k3">&lt;</span>i&gt;<span class="k2">)</span>
  <span class="k2">{</span>
    dest<span class="k3">&lt;</span>i&gt; <span class="k3">=</span> src<span class="k3">&lt;</span>i&gt;<span class="k2">;</span>
    i<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>
  <span class="k2">}</span>

  dest<span class="k3">&lt;</span>i&gt; <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>

  <span class="k1">return</span> dest<span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

Personally, I prefer this for strcpy
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">void</span> strcopy<span class="k2">(</span><span class="k1">char</span><span class="k3">*</span> dest, <span class="k1">char</span><span class="k3">*</span> src<span class="k2">)</span> <span class="k2">{</span>
      <span class="k1">while</span><span class="k2">(</span> <span class="k3">*</span>dest<span class="k3">+</span><span class="k3">+</span> <span class="k3">=</span> <span class="k3">*</span>src<span class="k3">+</span><span class="k3">+</span> <span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

and this for strncpy
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">void</span> strncopy<span class="k2">(</span><span class="k1">char</span><span class="k3">*</span> dest, <span class="k1">char</span><span class="k3">*</span> src, size_t len<span class="k2">)</span> <span class="k2">{</span>
      size_t current <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
      <span class="k1">while</span><span class="k2">(</span> <span class="k3">*</span>dest<span class="k3">+</span><span class="k3">+</span> <span class="k3">=</span> <span class="k3">*</span>src<span class="k3">+</span><span class="k3">+</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k3">+</span><span class="k3">+</span>current <span class="k3">&lt;</span> len <span class="k2">)</span><span class="k2">;</span>
      <span class="k3">*</span>dest <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

Untested, though.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Carrus85)</author>
		<pubDate>Fri, 09 Mar 2007 12:18:59 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
and this for strncpy<br />...<br />Untested, though.
</p></div></div><p>
Hello, Mr. Buffer Overflow. Nice to meet you. <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /></p><p>That writes one byte past the end of the dest buffer. Perhaps something like this:
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">void</span> strncopy<span class="k2">(</span><span class="k1">char</span><span class="k3">*</span> dest, <span class="k1">char</span><span class="k3">*</span> src, size_t len<span class="k2">)</span>
<span class="k2">{</span>
      <span class="k1">if</span><span class="k2">(</span>len<span class="k2">)</span>
      <span class="k2">{</span>
            size_t current <span class="k3">=</span> len-1<span class="k2">;</span>
            <span class="k1">while</span><span class="k2">(</span> current-- <span class="k2">)</span>
                  <span class="k3">*</span><span class="k2">(</span>dest<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k3">=</span> <span class="k3">*</span><span class="k2">(</span>src<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span><span class="k2">;</span>
            <span class="k3">*</span>dest <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
      <span class="k2">}</span>
<span class="k2">}</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kitty Cat)</author>
		<pubDate>Fri, 09 Mar 2007 12:50:46 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>KC: Yeah, I should have caught that.  I did state untested though <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" /> (I should have checked len&#39;s validity, then done *(dest-1) = 0 as dest is already past the end at that point...)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Carrus85)</author>
		<pubDate>Fri, 09 Mar 2007 13:10:29 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
I think Microsoft was deprecating the versions without lenght to prevent bugs.
</p></div></div><p>
Maybe thats how the idea came up.  But it ended up being more of a way to lock people into WINBLOWS specific code and make porting away from windows harder.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ImLeftFooted)</author>
		<pubDate>Fri, 09 Mar 2007 13:28:05 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="source-code snippet"><div class="inner"><pre><span class="k1">void</span> strcopy<span class="k2">(</span><span class="k1">char</span><span class="k3">*</span> dest, <span class="k1">char</span><span class="k3">*</span> src<span class="k2">)</span> <span class="k2">{</span>
      <span class="k1">while</span><span class="k2">(</span> <span class="k3">*</span>dest<span class="k3">+</span><span class="k3">+</span> <span class="k3">=</span> <span class="k3">*</span>src<span class="k3">+</span><span class="k3">+</span> <span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

It&#39;s efficient, but isn&#39;t compatible with strcpy() since it doesn&#39;t return the original dest. That is all.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Paul Pridham)</author>
		<pubDate>Fri, 09 Mar 2007 20:39:27 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Also nobody seemed to get the parameters right, it is<span class="source-code"><span class="k1">char</span><span class="k3">*</span> dest, <span class="k1">const</span> <span class="k1">char</span><span class="k3">*</span> src</span> <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (HoHo)</author>
		<pubDate>Fri, 09 Mar 2007 20:41:59 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>const is for wimps. <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Paul Pridham)</author>
		<pubDate>Fri, 09 Mar 2007 21:56:32 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>... and for compiler that wants to optimize as much as possible <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (HoHo)</author>
		<pubDate>Fri, 09 Mar 2007 22:28:34 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">HoHo said:</div><div class="quote"><p>
... and for compiler that wants to optimize as much as possible <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" />
</p></div></div><p>For the &quot;smarter&quot; ones, it often makes no difference.;)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Joel Pettersson)</author>
		<pubDate>Fri, 09 Mar 2007 22:40:23 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Maybe thats how the idea came up. But it ended up being more of a way to lock people into WINBLOWS specific code and make porting away from windows harder.
</p></div></div><p>
Actually, I would bet the amount of strn.* functions in the Linux kernel overwhelms the str[^n]+ ones. At least, that is what I would expect.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ReyBrujo)</author>
		<pubDate>Fri, 09 Mar 2007 23:37:19 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
For the &quot;smarter&quot; ones, it often makes no difference.;)
</p></div></div><p>
You&#39;ve found smart compilers?  Where?  Are they less then $10000 a license? *</p><p><sub>

* This is a joke.  Compilers are very far from perfect.</sub>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ImLeftFooted)</author>
		<pubDate>Sat, 10 Mar 2007 02:03:07 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
char* dest, const char* src
</p></div></div><p>

Well, of course.  Here, lets make it complete:
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">char</span><span class="k3">*</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_756.html" target="_blank">strcpy</a><span class="k2">(</span><span class="k1">char</span><span class="k3">*</span> dest, <span class="k1">const</span> <span class="k1">char</span><span class="k3">*</span> src<span class="k2">)</span> <span class="k2">{</span>
   <span class="k1">char</span><span class="k3">*</span> temp <span class="k3">=</span> dest<span class="k2">;</span>
   <span class="k1">while</span><span class="k2">(</span> <span class="k3">*</span>dest<span class="k3">+</span><span class="k3">+</span> <span class="k3">=</span> <span class="k3">*</span>src<span class="k3">+</span><span class="k3">+</span> <span class="k2">)</span><span class="k2">;</span>
   <span class="k1">return</span> temp<span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

Or, better yet:
</p><div class="source-code snippet"><div class="inner"><pre><span class="p">#include &lt;algorithm&gt;</span>

<span class="k1">char</span><span class="k3">*</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_769.html" target="_blank">strncpy</a><span class="k2">(</span><span class="k1">char</span><span class="k3">*</span> dest, <span class="k1">const</span> <span class="k1">char</span><span class="k3">*</span> src, <span class="k1">const</span> size_t len<span class="k2">)</span> <span class="k2">{</span>
   std::copy<span class="k2">(</span>src, src<span class="k3">+</span>len, dest<span class="k2">)</span><span class="k2">;</span> <span class="c">// hooray for the STL!</span>
   <span class="k3">*</span><span class="k2">(</span>dest<span class="k3">+</span>len-1<span class="k2">)</span> <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
   <span class="k1">return</span> dest<span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

<img src="http://www.allegro.cc/forums/smileys/grin.gif" alt=";D" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Carrus85)</author>
		<pubDate>Sat, 10 Mar 2007 02:14:25 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Congratulations! You&#39;ve just added 2MB to the executable. <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Paul Pridham)</author>
		<pubDate>Sat, 10 Mar 2007 05:46:08 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Congratulations! You&#39;ve just added 2MB to the executable. <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" />
</p></div></div><p>
</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="p">#include &lt;algorithm&gt;</span></td></tr><tr><td class="number">2</td><td>&#160;</td></tr><tr><td class="number">3</td><td><span class="k1">char</span><span class="k3">*</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_769.html" target="_blank">strncpy</a><span class="k2">(</span><span class="k1">char</span><span class="k3">*</span> dest, <span class="k1">const</span> <span class="k1">char</span><span class="k3">*</span> src, <span class="k1">const</span> size_t len<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">4</td><td>   std::copy<span class="k2">(</span>src, src<span class="k3">+</span>len, dest<span class="k2">)</span><span class="k2">;</span> <span class="c">// hooray for the STL!</span></td></tr><tr><td class="number">5</td><td>   <span class="k3">*</span><span class="k2">(</span>dest<span class="k3">+</span>len-1<span class="k2">)</span> <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">6</td><td>   <span class="k1">return</span> dest<span class="k2">;</span></td></tr><tr><td class="number">7</td><td><span class="k2">}</span></td></tr><tr><td class="number">8</td><td>&#160;</td></tr><tr><td class="number">9</td><td><span class="k1">int</span> main<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span></td></tr><tr><td class="number">10</td><td>        <span class="k1">char</span> <span class="k3">*</span>str1<span class="k3">=</span><span class="k1">new</span> <span class="k1">char</span><span class="k2">[</span><span class="n">10</span><span class="k2">]</span>, <span class="k3">*</span>str2<span class="k3">=</span><span class="k1">new</span> <span class="k1">char</span><span class="k2">[</span><span class="n">10</span><span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">11</td><td>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_769.html" target="_blank">strncpy</a><span class="k2">(</span>str2, str1, <span class="n">9</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">12</td><td>        <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">13</td><td><span class="k2">}</span></td></tr><tr><td class="number">14</td><td>&#160;</td></tr><tr><td class="number">15</td><td><span class="p">#g++ test.cpp</span></td></tr><tr><td class="number">16</td><td><span class="p">#ls -l a.out</span></td></tr><tr><td class="number">17</td><td><span class="k3">-</span>rwxr-xr-x <span class="n">1</span> hoho users <span class="n">7061</span> Mar <span class="n">10</span> <span class="n">02</span><span class="k2">:</span><span class="n">04</span> a.out</td></tr></tbody></table></div></div><p>If in doubt, benchmark <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (HoHo)</author>
		<pubDate>Sat, 10 Mar 2007 06:06:39 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
You&#39;ve found smart compilers? Where? Are they less then $10000 a license? *</p><ul><li><p>This is a joke. Compilers are very far from perfect.
</p></li></ul></div></div><p>Hence the quotes around and usage of &quot;smarter&quot; rather than &quot;smart&quot;. I know all too well; my recent experiences with the way GCC reacts to and handles x87 (ye olde register-stack-based x86 FPU) inline assembly makes me feel like hand-coding all my DSP code in assembly.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Joel Pettersson)</author>
		<pubDate>Sat, 10 Mar 2007 08:41:05 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="source-code snippet"><div class="inner"><pre><span class="k3">-</span>rwxrwxrwx<span class="k3">+</span> <span class="n">1</span> Administrators None   <span class="n">248</span> Mar  <span class="n">9</span> <span class="n">22</span><span class="k2">:</span><span class="n">46</span> c_version.c<span class="k3">*</span>
<span class="k3">-</span>rwxr-xr-x  <span class="n">1</span> ppridham       None  <span class="n">7691</span> Mar  <span class="n">9</span> <span class="n">22</span><span class="k2">:</span><span class="n">47</span> c_version.exe<span class="k3">*</span>
<span class="k3">-</span>rwxrwxrwx<span class="k3">+</span> <span class="n">1</span> Administrators None   <span class="n">335</span> Mar  <span class="n">9</span> <span class="n">22</span><span class="k2">:</span><span class="n">47</span> stl_version.cpp<span class="k3">*</span>
<span class="k3">-</span>rwxr-xr-x  <span class="n">1</span> ppridham       None <span class="n">41201</span> Mar  <span class="n">9</span> <span class="n">22</span><span class="k2">:</span><span class="n">47</span> stl_version.exe<span class="k3">*</span>
</pre></div></div><p>

Huh. Pretty bloated in Cygwin it seems.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Paul Pridham)</author>
		<pubDate>Sat, 10 Mar 2007 09:48:13 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Try compiling with <i>-O2 -ffast-math -fomit-frame-pointer</i>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ReyBrujo)</author>
		<pubDate>Sat, 10 Mar 2007 11:18:12 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Better with -Os and maybe with -fomit-frame-pointer <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /><br />Also a mingw und UPx compressing might be interesting.</p><p>Carrus85 version of strncpy (no optimizations, -Os):
</p><div class="source-code snippet"><div class="inner"><pre><span class="k3">-</span>rwxr-xr-x <span class="n">1</span> hoho users <span class="n">6644</span> Mar <span class="n">10</span> <span class="n">10</span><span class="k2">:</span><span class="n">48</span> a.out
<span class="k3">-</span>rwxr-xr-x <span class="n">1</span> hoho users <span class="n">6604</span> Mar <span class="n">10</span> <span class="n">10</span><span class="k2">:</span><span class="n">48</span> a.out
</pre></div></div><p>
libc strncpy:</p><div class="source-code snippet"><div class="inner"><pre><span class="k3">-</span>rwxr-xr-x <span class="n">1</span> hoho users <span class="n">6525</span> Mar <span class="n">10</span> <span class="n">10</span><span class="k2">:</span><span class="n">50</span> a.out
<span class="k3">-</span>rwxr-xr-x <span class="n">1</span> hoho users <span class="n">6517</span> Mar <span class="n">10</span> <span class="n">10</span><span class="k2">:</span><span class="n">50</span> a.out
</pre></div></div><p>I wondeor how it is possible that libc&#39;s strncpy creates smaller executable than the function Carrus gave</p><p>Seems to me as there isn&#39;t much difference between C and C++, not at least under Linux <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (HoHo)</author>
		<pubDate>Sat, 10 Mar 2007 14:47:34 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Another silly discussion but...</p><div class="source-code snippet"><div class="inner"><pre>string copy<span class="k2">(</span>src<span class="k2">)</span>
copy.c_str<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Goalie Ca)</author>
		<pubDate>Sat, 10 Mar 2007 15:12:19 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>When did A.cc become the Royal Benchmarking Society? Some of the threads have become kind of like Programmer Mythbusters <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />. &quot;Is Java REALLY slower? Does STL really bloat your exes? Find out with your friendly host, HoHo, and his benchmarking machine!&quot;.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Jakub Wasilewski)</author>
		<pubDate>Mon, 12 Mar 2007 04:18:34 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I like to think the community has just moved away from it-is-so-because-guru-says-it-is mysticism.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CGamesPlay)</author>
		<pubDate>Mon, 12 Mar 2007 04:23:24 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The community has grown wiser <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ImLeftFooted)</author>
		<pubDate>Mon, 12 Mar 2007 10:27:12 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
I like to think the community has just moved away from it-is-so-because-guru-says-it-is mysticism.
</p></div></div><p>
Using the ++ operator makes your programs larger.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Billybob)</author>
		<pubDate>Mon, 12 Mar 2007 11:41:40 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Using the ++ operator makes your programs larger.
</p></div></div><p>
How very wise.  Another little known fact is that for statements also make your programs larger!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ImLeftFooted)</author>
		<pubDate>Mon, 12 Mar 2007 12:31:10 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
I like to think the community has just moved away from it-is-so-because-guru-says-it-is mysticism.
</p></div></div><p>I&#39;d like to think that people benchmark more and guess less <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /></p><p>Jakub Wasilewski, thanks for my new sig <img src="http://www.allegro.cc/forums/smileys/grin.gif" alt=";D" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (HoHo)</author>
		<pubDate>Mon, 12 Mar 2007 14:49:58 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The posted strncpy() replacement also violates the semantics of strncpy, namely that the destination buffer is padded up to the length if the source is shorter.  And it&#39;s invalid if called with length 0.</p><p>There&#39;s no reason to reinvent these functions except for better portability... because doing so creates problems like this that lurk, just waiting to be exploited in released code.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (runderwo)</author>
		<pubDate>Thu, 15 Mar 2007 23:22:31 +0000</pubDate>
	</item>
</rss>
