<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=37821&amp;view=findpost&amp;p=1755432</guid>
        <pubDate>Wed, 07 Nov 2007 12:16:34 +0000</pubDate>
        <title>Преобразование строки в число и обратно</title>
        <link>https://forum.sources.ru/index.php?showtopic=37821&amp;view=findpost&amp;p=1755432</link>
        <description><![CDATA[Qraizer: А чё никто не упомянул самые что ни на есть стандартные фасеты <strong class='tag-b'>std::num_get&lt;&gt;</strong> и <strong class='tag-b'>std::num_put&lt;&gt;</strong> вкупе с итераторами от <strong class='tag-b'>std::basic_string&lt;&gt;</strong>, а то и простыми указателями? Как показывает практика, производительность не только <strong class='tag-b'>boost::lexical_cast&lt;&gt;</strong> отдыхает, но зачастую - правда это уже зависит от конкретной реализации - и C-функции покуривают.<br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Сообщения были разделены в тему &quot;<a class='tag-url' href='http://forum.sources.ru/index.php?showtopic=218397' target='_blank'>фасеты STL vs функции RTL</a>&quot;</span></span>]]></description>
        <author>Qraizer</author>
        <category>C/C++ FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=37821&amp;view=findpost&amp;p=1754748</guid>
        <pubDate>Wed, 07 Nov 2007 05:29:43 +0000</pubDate>
        <title>Преобразование строки в число и обратно</title>
        <link>https://forum.sources.ru/index.php?showtopic=37821&amp;view=findpost&amp;p=1754748</link>
        <description><![CDATA[trainer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=37821&view=findpost&p=1754454'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Maxidrom &#064; <time class="tag-quote__quoted-time" datetime="2007-11-06T17:41:30+00:00">06.11.07, 17:41</time></span><div class='quote '>Вот кстати есть еще одна простая функция преобразования строки в число</div></div>Это специфичная для Windows функция. Никакого практического смысла в ее использовании нет.]]></description>
        <author>trainer</author>
        <category>C/C++ FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=37821&amp;view=findpost&amp;p=1754454</guid>
        <pubDate>Tue, 06 Nov 2007 17:41:30 +0000</pubDate>
        <title>Преобразование строки в число и обратно</title>
        <link>https://forum.sources.ru/index.php?showtopic=37821&amp;view=findpost&amp;p=1754454</link>
        <description><![CDATA[Maxidrom: Вот кстати есть еще одна простая функция преобразования строки в число: <br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">int var;</div><div class="code_line">char str[100];</div><div class="code_line">&nbsp;</div><div class="code_line">var=StrToInt(str);</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
Для её работы необходимо в настройках проекта Project-&gt;Settings-&gt;Link добавить shlwapi.lib<br>
И заголовочные файлы:<br>
<br>
#include &lt;windows.h&gt;<br>
#include &lt;shlwapi.h&gt;<br>
<br>
И вот может кому-нить пригодится, у меня была лабораторная записать арифмитическое выражение как строку и вычислить его, <br>
вроде работает, только в конце введенного выражния нужно обязательно точку ставить (операции выполняются в порядке их следования):<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">char str[512]=&quot;&quot;, temp[512]=&quot;&quot;;</div><div class="code_line">bool b=true;</div><div class="code_line">int var=0;</div><div class="code_line">&nbsp;</div><div class="code_line">printf_rus(&quot;\nВведите арифметическое выражение: &quot;, 27);</div><div class="code_line">&nbsp;</div><div class="code_line">cin&#62;&#62;str;</div><div class="code_line">&nbsp;</div><div class="code_line">for (i=0, j=0; i&#60;strlen(str); i++)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (str[i]!=&#39;+&#39; &amp;&amp; str[i]!=&#39;-&#39; &amp;&amp; str[i]!=&#39;/&#39; &amp;&amp; str[i]!=&#39;*&#39; &amp;&amp; str[i]!=&#39;.&#39;)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;temp[j]=str[i]; j++;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (b) { var+=StrToInt(temp); b=false; }</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (str[i-2]==&#39;+&#39;) { var+=StrToInt(temp); }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (str[i-2]==&#39;-&#39;) { var-=StrToInt(temp); }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (str[i-2]==&#39;/&#39;) { var/=StrToInt(temp); }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (str[i-2]==&#39;*&#39;) { var*=StrToInt(temp); }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;j=0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">printf_rus(&quot;\nОтвет: &quot;, 27); printf(&quot;%i\n&quot;, var);</div></ol></div></div></div></div>]]></description>
        <author>Maxidrom</author>
        <category>C/C++ FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=37821&amp;view=findpost&amp;p=1175333</guid>
        <pubDate>Thu, 13 Jul 2006 06:39:32 +0000</pubDate>
        <title>Преобразование строки в число и обратно</title>
        <link>https://forum.sources.ru/index.php?showtopic=37821&amp;view=findpost&amp;p=1175333</link>
        <description><![CDATA[LPBOY: А вторая часть ФАКа уже вышла? :)]]></description>
        <author>LPBOY</author>
        <category>C/C++ FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=37821&amp;view=findpost&amp;p=1027899</guid>
        <pubDate>Mon, 27 Feb 2006 09:50:19 +0000</pubDate>
        <title>Преобразование строки в число и обратно</title>
        <link>https://forum.sources.ru/index.php?showtopic=37821&amp;view=findpost&amp;p=1027899</link>
        <description><![CDATA[Flex Ferrum: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=37821&view=findpost&p=548303'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>byte &#064; <time class="tag-quote__quoted-time" datetime="2004-12-19T18:06:59+00:00">19.12.04, 18:06</time></span><div class='quote '>Что-то ничего не сказано про boost::lexical_cast&lt;&gt;.. </div></div><br>
Теперь можно почитать тут: <a class='tag-url' href='http://www.sources.ru/wiki/doku.php?id=doc:cpp:boost:lexical_cast' target='_blank'>boost::lexical_cast</a>.]]></description>
        <author>Flex Ferrum</author>
        <category>C/C++ FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=37821&amp;view=findpost&amp;p=855202</guid>
        <pubDate>Tue, 13 Sep 2005 14:30:50 +0000</pubDate>
        <title>Преобразование строки в число и обратно</title>
        <link>https://forum.sources.ru/index.php?showtopic=37821&amp;view=findpost&amp;p=855202</link>
        <description><![CDATA[LuckLess: <strong class='tag-b'>Adil</strong><br>
как бы так в одну строчку завернуть.. чтобы еще и 0 правильно запичывался....<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">int num;</div><div class="code_line">char strnum[10]={&#39;{text}&#39;};</div><div class="code_line">&nbsp;</div><div class="code_line">for (int tmp = num , i = 0 ; tmp||!i ; strnum[i++] =&#39;0&#39;+tmp%10 , tmp/=10);</div><div class="code_line">strrev(strnum);</div></ol></div></div></div></div><br>
во.]]></description>
        <author>LuckLess</author>
        <category>C/C++ FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=37821&amp;view=findpost&amp;p=854995</guid>
        <pubDate>Tue, 13 Sep 2005 11:38:18 +0000</pubDate>
        <title>Преобразование строки в число и обратно</title>
        <link>https://forum.sources.ru/index.php?showtopic=37821&amp;view=findpost&amp;p=854995</link>
        <description><![CDATA[Adil: А..., так ты это на пост <strong class='tag-b'>volod</strong> ответил. <br>
З.З.Ы. У вас кстати у обоих интересная реакция на num=0 будет проистекать...]]></description>
        <author>Adil</author>
        <category>C/C++ FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=37821&amp;view=findpost&amp;p=854782</guid>
        <pubDate>Tue, 13 Sep 2005 09:13:53 +0000</pubDate>
        <title>Преобразование строки в число и обратно</title>
        <link>https://forum.sources.ru/index.php?showtopic=37821&amp;view=findpost&amp;p=854782</link>
        <description><![CDATA[LuckLess: <strong class='tag-b'>Adil</strong><br>
нет конечно. Прочто если уш руками переводить.. то без рекурсии))<br>
А так , конечно , лучше использовать itoa() и не мучить себя циклами и тем более рекурсиями).]]></description>
        <author>LuckLess</author>
        <category>C/C++ FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=37821&amp;view=findpost&amp;p=854569</guid>
        <pubDate>Tue, 13 Sep 2005 06:39:24 +0000</pubDate>
        <title>Преобразование строки в число и обратно</title>
        <link>https://forum.sources.ru/index.php?showtopic=37821&amp;view=findpost&amp;p=854569</link>
        <description><![CDATA[Adil: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=37821&view=findpost&p=854104'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>LuckLess &#064; <time class="tag-quote__quoted-time" datetime="2005-09-12T15:06:16+00:00">12.09.05, 15:06</time></span><div class='quote '>зачем так сложноо?</div></div>Хочешь сказать, что<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">int num;</div><div class="code_line">char strnum[12]={&#39;{text}&#39;};</div><div class="code_line">itoa(num,strnum,10);</div></ol></div></div></div></div>сложнее, чем у тебя? :) <br>
З.Ы. strnum[i++] = <strong class='tag-b'>&#39;0&#39;+</strong>tmp%10   ;)]]></description>
        <author>Adil</author>
        <category>C/C++ FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=37821&amp;view=findpost&amp;p=854104</guid>
        <pubDate>Mon, 12 Sep 2005 15:06:16 +0000</pubDate>
        <title>Преобразование строки в число и обратно</title>
        <link>https://forum.sources.ru/index.php?showtopic=37821&amp;view=findpost&amp;p=854104</link>
        <description><![CDATA[LuckLess: зачем так сложноо?<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">int num;</div><div class="code_line">char strnum[10]={&#39;{text}&#39;};</div><div class="code_line">&nbsp;</div><div class="code_line">for (int tmp = num , i = 0 ; tmp ; strnum[i++] =&#39;0&#39;+tmp%10 , tmp/=10);</div><div class="code_line">strrev(strnum);</div></ol></div></div></div></div>]]></description>
        <author>LuckLess</author>
        <category>C/C++ FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=37821&amp;view=findpost&amp;p=849143</guid>
        <pubDate>Wed, 07 Sep 2005 07:57:44 +0000</pubDate>
        <title>Преобразование строки в число и обратно</title>
        <link>https://forum.sources.ru/index.php?showtopic=37821&amp;view=findpost&amp;p=849143</link>
        <description><![CDATA[bojo: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=37821&view=findpost&p=245018'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Flex Ferrum &#064; <time class="tag-quote__quoted-time" datetime="2003-11-13T20:50:30+00:00">13.11.03, 20:50</time></span><div class='quote '>Типичное использование этих функций такое:<br>
<br>
CODE 	<br>
<br>
<br>
char* end_ptr;<br>
<br>
long val = strtol(str, &amp;end_ptr, 10);<br>
<br>
if (*end_ptr)<br>
<br>
{<br>
<br>
// Сигнализируем об ошибке в строке<br>
<br>
}<br>
<br>
if ((val == LONG_MAX || val == LONG_MIN) &amp;&amp; errno == ERANGE)<br>
<br>
{<br>
<br>
// Сигнализируем о переполнении<br>
<br>
}<br>
<br>
// Продолжаем штатную работу.</div></div><br>
<br>
Маленький нюанс. В случае пустой строки на входе *end_ptr == 0, то есть сигнала об ошибке в строке не будет, а strtol вернет ноль. Таким образом мы преобразуем пустую строку в число 0, что есть плохо. Надо еще проверить, что строка ненулевая.]]></description>
        <author>bojo</author>
        <category>C/C++ FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=37821&amp;view=findpost&amp;p=749187</guid>
        <pubDate>Wed, 15 Jun 2005 06:42:38 +0000</pubDate>
        <title>Преобразование строки в число и обратно</title>
        <link>https://forum.sources.ru/index.php?showtopic=37821&amp;view=findpost&amp;p=749187</link>
        <description><![CDATA[volod: Еще один вариант, рекурсивный (плагиат)... <br>
Можно использовать такую процедуру: <br>
<br>
char str[16]; <br>
int lp=0; <br>
<br>
void itoa(int number) <br>
{ <br>
	if(number) <br>
	{ <br>
		itoa(number/10); <br>
		str[lp]=(number%10+&#39;0&#39;); //заполняем очередную цифру <br>
		lp++; <br>
	} <br>
} <br>
<br>
//А вызывать её примерно так <br>
itoa(12345) <br>
str[lp]=0; //заключительный ноль <br>
lp=0; //для других вызовов]]></description>
        <author>volod</author>
        <category>C/C++ FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=37821&amp;view=findpost&amp;p=550450</guid>
        <pubDate>Tue, 21 Dec 2004 11:36:19 +0000</pubDate>
        <title>Преобразование строки в число и обратно</title>
        <link>https://forum.sources.ru/index.php?showtopic=37821&amp;view=findpost&amp;p=550450</link>
        <description><![CDATA[trainer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=37821&view=findpost&p=550358'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>BioUnit &#064; 21.12.04, 13:37</span><div class='quote '>Думаю, таой способ тоже имеет право на жизнь</div></div>Это именно то, что делает boost::lexical_cast]]></description>
        <author>trainer</author>
        <category>C/C++ FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=37821&amp;view=findpost&amp;p=550358</guid>
        <pubDate>Tue, 21 Dec 2004 10:37:49 +0000</pubDate>
        <title>Преобразование строки в число и обратно</title>
        <link>https://forum.sources.ru/index.php?showtopic=37821&amp;view=findpost&amp;p=550358</link>
        <description><![CDATA[BioUnit: Думаю, таой способ тоже имеет право на жизнь:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &#60;string&#62;</div><div class="code_line">#include &#60;sstream&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">template &#60;typename T&#62;</div><div class="code_line">std::string toString(T val)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::ostringstream oss;</div><div class="code_line">&nbsp;&nbsp; &nbsp;oss&#60;&#60; val;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return oss.str();</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">template&#60;typename T&#62; </div><div class="code_line">T fromString(const std::string&amp; s) </div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;std::istringstream iss(s);</div><div class="code_line">&nbsp;&nbsp;T res;</div><div class="code_line">&nbsp;&nbsp;iss &#62;&#62; res;</div><div class="code_line">&nbsp;&nbsp;return res;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">// Пример использования</div><div class="code_line">std::string str;</div><div class="code_line">int iVal;</div><div class="code_line">float fVal;</div><div class="code_line">&nbsp;</div><div class="code_line">str = toString(iVal);</div><div class="code_line">str = tiString(fVal);</div><div class="code_line">&nbsp;</div><div class="code_line">iVal = fromString&#60;int&#62;(str);</div><div class="code_line">fVal = fromString&#60;float&#62;(str);</div></ol></div></div></div></div>]]></description>
        <author>BioUnit</author>
        <category>C/C++ FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=37821&amp;view=findpost&amp;p=549826</guid>
        <pubDate>Mon, 20 Dec 2004 20:38:35 +0000</pubDate>
        <title>Преобразование строки в число и обратно</title>
        <link>https://forum.sources.ru/index.php?showtopic=37821&amp;view=findpost&amp;p=549826</link>
        <description><![CDATA[Flex Ferrum: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=37821&view=findpost&p=548303'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>byte &#064; 19.12.04, 21:06</span><div class='quote '>Что-то ничего не сказано про boost::lexical_cast&lt;&gt;.. :rolleyes:</div></div><br>
Дело в том, что boost::lexical_cast несколько выходит за набор стандартных средств и библиотек, поставляемых с компиляторами &quot;по умолчанию&quot;.]]></description>
        <author>Flex Ferrum</author>
        <category>C/C++ FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=37821&amp;view=findpost&amp;p=548303</guid>
        <pubDate>Sun, 19 Dec 2004 18:06:59 +0000</pubDate>
        <title>Преобразование строки в число и обратно</title>
        <link>https://forum.sources.ru/index.php?showtopic=37821&amp;view=findpost&amp;p=548303</link>
        <description><![CDATA[byte: Что-то ничего не сказано про boost::lexical_cast&lt;&gt;.. :rolleyes:]]></description>
        <author>byte</author>
        <category>C/C++ FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=37821&amp;view=findpost&amp;p=438005</guid>
        <pubDate>Sun, 22 Aug 2004 21:44:28 +0000</pubDate>
        <title>Преобразование строки в число и обратно</title>
        <link>https://forum.sources.ru/index.php?showtopic=37821&amp;view=findpost&amp;p=438005</link>
        <description><![CDATA[stealth296: А можно оптимизировать и обобщить ф-ии подобные _itow, _ltow, _ultow, _i64tow, _ui64tow и их ANSI аналоги. Причём ниже приведённая ф-ия будет работать куда быстрее чем стандартные. Например, для преобразования целого в строковый параметр UNICODE, все аналоги с префиксом _w, сначала создают буфер char фиксированного размера, затем вызывают одноимённые версии для С-строк, которые вызывают xtoa или x64toa, затем происходит вызов ф-ий преобразования для преобразования ANSI в UNICODE (mbstowcs и __mbstowcs_mt). Эта ф-ии не делает никаких косвенных вызовов, и требует меньше времени на прохождение по её телу. Прюс ещё одно отличие от стандарта, при преобразовании в 16-ричное число к строке добавляется префикс &quot;&#092;0x&quot;.<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;</div><div class="code_line">// The following constants must be used during the function call.</div><div class="code_line">enum Radix {</div><div class="code_line">&nbsp;&nbsp; &nbsp;BINARY = 2,</div><div class="code_line">&nbsp;&nbsp; &nbsp;OCTOPLE = 8,</div><div class="code_line">&nbsp;&nbsp; &nbsp;DECIMAL = 10,</div><div class="code_line">&nbsp;&nbsp; &nbsp;HEXADEMICAL = 16</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">template&#60;class Int, class Str&#62;</div><div class="code_line">void</div><div class="code_line">APIENTRY</div><div class="code_line">itos(Int val, Str buf, UINT size, Radix r=DECIMAL) throw()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;Str offset = buf; &nbsp; // a pointer to a string</div><div class="code_line">&nbsp;&nbsp; &nbsp;Str first = offset; // a pointer to</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// the first digit</div><div class="code_line">&nbsp;&nbsp; &nbsp;UINT delta_y; &nbsp; &nbsp; &nbsp; &nbsp;// the value of a digit</div><div class="code_line">&nbsp;&nbsp; &nbsp;UINT count = 0; &nbsp; &nbsp; // a number of digits</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// in the string</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// val is negative, so let&#39;s add &#39;-&#39; to</div><div class="code_line">&nbsp;&nbsp; &nbsp;// the begin of the string.</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (val &#60; 0) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;*offset++ = &#39;-&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;val = -val;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;first = offset;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Take special actions for hexademical and</div><div class="code_line">&nbsp;&nbsp; &nbsp;// octople countable systems and insert to the</div><div class="code_line">&nbsp;&nbsp; &nbsp;// begin of the string either the &quot;{text}x&quot; or &#39;0&#39;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// prefixes respectively.</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (r == HEXADEMICAL) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;*offset++ = &#39;0&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;*offset++ = &#39;x&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;first = offset;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;else if (r == OCTOPLE) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;*offset++ = &#39;0&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;first = offset;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Read and store digits into the string.</div><div class="code_line">&nbsp;&nbsp; &nbsp;while (val &#62; 0 &amp;&amp; size-- &#62;= 0) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;delta_y = (Int)(val % r);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;val /= r;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (delta_y &#62; 9)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// The hexademical format.</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; *offset++ = (delta_y - 10 + &#39;a&#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Binary, dicimal and octople formats.</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*offset++ = (delta_y + &#39;0&#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;count++;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Points to the last digit.</div><div class="code_line">&nbsp;&nbsp; &nbsp;*offset-- = &#39;{text}&#39;;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Now our string corresponds to the integer</div><div class="code_line">&nbsp;&nbsp; &nbsp;// digits but it is in the reverse order. So make</div><div class="code_line">&nbsp;&nbsp; &nbsp;// the backward transformation of it. If it has</div><div class="code_line">&nbsp;&nbsp; &nbsp;// only two characters just swap them without any</div><div class="code_line">&nbsp;&nbsp; &nbsp;// additional actions.</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (count == 1)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return;</div><div class="code_line">&nbsp;&nbsp; &nbsp;else if (count == 2) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;char temp = (char)*offset;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;*offset-- = *first;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;*first++ = temp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;// For more than two characters in the string</div><div class="code_line">&nbsp;&nbsp; &nbsp;// reverse full string in the folowing cycle.</div><div class="code_line">&nbsp;&nbsp; &nbsp;else {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;delta_y = count / 2;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;while (delta_y--) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;char temp = (char)*first;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*first++ = *offset;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*offset-- = temp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">}</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
Использование ф-ии &quot;почти&quot; не отличается от стандартных. :)]]></description>
        <author>stealth296</author>
        <category>C/C++ FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=37821&amp;view=findpost&amp;p=247669</guid>
        <pubDate>Tue, 18 Nov 2003 12:31:59 +0000</pubDate>
        <title>Преобразование строки в число и обратно</title>
        <link>https://forum.sources.ru/index.php?showtopic=37821&amp;view=findpost&amp;p=247669</link>
        <description><![CDATA[trainer:  Небольшая поправочка:<br>для printf 64-разрядное целое: I64 ([i-64], Microsoft, __int64), L ([ell],Borland, __int64), ll ([ell-ell], POSIX, long long)<br><!--emo&:)--><img src='http://forum.sources.ru/html/emoticons/smile.gif' border='0' style='vertical-align:middle' alt='smile.gif' /><!--endemo--> ]]></description>
        <author>trainer</author>
        <category>C/C++ FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=37821&amp;view=findpost&amp;p=245018</guid>
        <pubDate>Thu, 13 Nov 2003 20:50:30 +0000</pubDate>
        <title>Преобразование строки в число и обратно</title>
        <link>https://forum.sources.ru/index.php?showtopic=37821&amp;view=findpost&amp;p=245018</link>
        <description><![CDATA[Flex_Ferrum: <span class='tag-size' data-value='14' style='font-size:14pt;'><strong class='tag-b'>Несколько способов преобразования строки в число и обратно.</strong></span><br>
<br>
Очень часто в форуме всплывает один и тот же вопрос - &quot;Как преобразовать char*/char[]/CString/string в число?&quot; или, несколько реже &quot;Как преобразовать число в char*/char[]/CString/string&quot;. В этой небольшой статье я попытаюсь на него ответить максимально полным образом.<br>
<br>
<span class='tag-size' data-value='13' style='font-size:13pt;'><em class='tag-i'><strong class='tag-b'>Преобразование строки в число</strong></em></span><br>
<br>
Выполнить преобразование строки в число можно многими способами - выбор конкретного зависит от ваших целей на момент написания кода. Есть штатные способы - ряд библиотечных функций, есть более изощренные, есть совсем уж извращенные годные разве что для экзерсисов в области программирования. Начну с самых простых.<br>
Первый, и, наверное, самый распространенный, но далеко не самый лучший - использование штатных библиотечных функций <strong class='tag-b'>atoi, atof, atol</strong>. Эти функции входит в стандартную библиотеку языка и присутствует в любом компиляторе. Их объявления выглядит так:<br>
<br>
<span class='tag-size' data-value='12' style='font-size:12pt;'><span class="tag-font" data-value="Courier" style="font-family:Courier"><strong class='tag-b'>int</strong> <em class='tag-i'><strong class='tag-b'>atoi</strong></em>(<strong class='tag-b'>const char</strong>* <em class='tag-i'>str</em>)<br>
<strong class='tag-b'>long</strong> <em class='tag-i'><strong class='tag-b'>atol</strong></em>(<strong class='tag-b'>const char</strong>* <em class='tag-i'>str</em>)<br>
<strong class='tag-b'>double</strong> <em class='tag-i'><strong class='tag-b'>atof</strong></em>(<strong class='tag-b'>const char</strong>* <em class='tag-i'>str</em>)</span></span><br>
<br>
На вход они принимают указатель на строку, завершенную нулем, а возвращают - число, которое этой строкой описывается. <strong class='tag-b'>atoi</strong> и <strong class='tag-b'>atol</strong> воспринимают следующий формат числа:<br>
[<em class='tag-i'>пробелы</em>][<em class='tag-i'>знак</em>]<em class='tag-i'>цифры<br>
</em>а <strong class='tag-b'>atof</strong>, соответственно:<br>
[<em class='tag-i'>пробелы</em>][<em class='tag-i'>знак</em>][<em class='tag-i'>цифры</em>][<strong class='tag-b'>.</strong><em class='tag-i'>цифры</em>][{<strong class='tag-b'>d</strong> | <strong class='tag-b'>D</strong> | <strong class='tag-b'>e</strong> | <strong class='tag-b'>E</strong> }[<em class='tag-i'>знак</em>]<em class='tag-i'>цифры</em>]<br>
Здесь <em class='tag-i'>пробелы</em> - любой из знаков пробела, табуляции (&#092;t), вертикальной табуляции (&#092;v) - они игнорируются. <em class='tag-i'>Знак</em> - символ &#39;+&#39; или &#39;-&#39;. Если не указан, то считается, что число положительное. Цифры - символы от &#39;0&#39; до &#39;9&#39;. Для числа с плавающей точкой, если не указаны цифры до знака &#39;.&#39;, то должна быть указана хотя бы одна цифра после него. После дробной части может быть указана экспонента, следующая за одним из символов-префиксов экспоненты.<br>
Основной недостаток этих функций заключается в том, что они никак не сигнализируют об ошибке, если таковая произошла в процессе разбора переданной строки. Под ошибкой я понимаю невозможность корректно разобрать переданный набор символов - несоответствие его формату или по иным причинам.<br>
Эту проблему решает следующий набор библиотечных функций, также включенных в стандартную библиотеку:<br>
<br>
<span class='tag-size' data-value='12' style='font-size:12pt;'><span class="tag-font" data-value="Courier" style="font-family:Courier"><strong class='tag-b'>long <em class='tag-i'>strtol</em></strong>(<strong class='tag-b'>const char</strong>* <em class='tag-i'>str</em>, <strong class='tag-b'>char</strong>** <em class='tag-i'>end_ptr</em>, <strong class='tag-b'>int</strong> <em class='tag-i'>radix</em>)<br>
<strong class='tag-b'>unsigned long <em class='tag-i'>strtoul</em></strong>(<strong class='tag-b'>const char</strong>* <em class='tag-i'>str</em>, <strong class='tag-b'>char</strong>** <em class='tag-i'>end_ptr</em>, <strong class='tag-b'>int</strong> <em class='tag-i'>radix</em>)<br>
<strong class='tag-b'>double <em class='tag-i'>strtod</em></strong>(<strong class='tag-b'>const char</strong>* <em class='tag-i'>str</em>, <strong class='tag-b'>char</strong>** <em class='tag-i'>end_ptr</em>)</span></span><br>
<br>
Эти функции имеют следующие отличия от предыдущей группы:<ul class="tag-list"><li>Через параметр end_ptr они возвращают указатель на первый символ, который не может быть интерпретирован как часть числа.</li><li>Контролируют переполнение и, если таковое произошло, сигнализируют об этом выставлением значения переменной errno в ERANGE, а также возвращают, соответственно, LONG_MAX/LONG_MIN, ULONG_MAX/ULONG_MIN и +/-HUGE_VAL в зависимости от знака числа в переданной строке.</li><li><strong class='tag-b'>strtod</strong> использует информацию о текущих установленных (через setlocale) региональных настройках, таким образом может корректно интерпретировать числа с символом &#39;,&#39; в качестве разделителя целой и дробной части.</li><li>Для функций <strong class='tag-b'>strtol</strong> и <strong class='tag-b'>strtoul</strong> можно указать основание системы счисления. При этом, если в качестве основания передан 0, то основание определяется автоматически по первым символам числа. Если это символ &#39;0&#39;, а сразу за ним идет цифра - то основание принимается равным 8. Если первая цифра &#39;0&#39;, а за ней идет символ &#39;x&#39; или &#39;X&#39;, то основание принимается равным 16. В остальных случаях основание принимается равным 10. В качестве цифр в этом случае можно использовать символы &#39;0&#39; - &#39;9&#39; и &#39;A&#39; - &#39;Z&#39; или &#39;a&#39; - &#39;z&#39;, а основание может принимать значения от 2 до 36.</li><li>Если варианты этих функций для преобразования чисел, описанных unicode-строками. Они, соответственно, носят названия <strong class='tag-b'>wcstol</strong> <strong class='tag-b'>wcstoul</strong> и <strong class='tag-b'>wcstod</strong>.</li></ul>Типичное использование этих функций такое:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">char* end_ptr;</div><div class="code_line">long val = strtol(str, &amp;end_ptr, 10);</div><div class="code_line">if (*end_ptr)</div><div class="code_line">{</div><div class="code_line">// Сигнализируем об ошибке в строке</div><div class="code_line">}</div><div class="code_line">if ((val == LONG_MAX || val == LONG_MIN) &amp;&amp; errno == ERANGE)</div><div class="code_line">{</div><div class="code_line">// Сигнализируем о переполнении</div><div class="code_line">}</div><div class="code_line">// Продолжаем штатную работу.</div></ol></div></div></div></div><br>
Как можно увидеть, используя эти функции можно получить гораздо больший контроль над преобразованием из строки в число. Для различных преобразований рекомендую пользоваться именно ими.<br>
Говоря о стандартных библиотечных функциях нельзя не упомянуть такую функцию как <strong class='tag-b'>scanf</strong> и ее разновидности - <strong class='tag-b'>sscanf</strong>, <strong class='tag-b'>fscanf</strong> и т. п:<br>
<br>
<span class='tag-size' data-value='12' style='font-size:12pt;'><span class="tag-font" data-value="Courier" style="font-family:Courier"><strong class='tag-b'>int <em class='tag-i'>scanf</em></strong>(<strong class='tag-b'>const char</strong>* <em class='tag-i'>format</em>, ...)<br>
<strong class='tag-b'>int <em class='tag-i'>sscanf</em></strong>(<strong class='tag-b'>const char</strong>* <em class='tag-i'>buff</em>, <strong class='tag-b'>const char</strong>* <em class='tag-i'>format</em>, ...)<br>
<strong class='tag-b'>int <em class='tag-i'>fscanf</em></strong>(FILE* <em class='tag-i'>file</em>, <strong class='tag-b'>const</strong> <strong class='tag-b'>char</strong>* <em class='tag-i'>format</em>, ...)</span></span><br>
<br>
и т. п.<br>
Эту функцию имеет смысл использовать только в случае получения числа от пользователя с консоли (stdin) или из файла. Надо отметить, что функция весьма тяжеловесна (по объему линкуемого к исполняемому модулю библиотечного кода), и далеко не так быстра, как предыдущие, т. к. для преобразования необходимо разобрать форматную строку и соответствующим образом ее проинтерпретировать.<br>
Аналогично можно использовать операторы потокового ввода (&#39;&gt;&gt;&#39;). В случае написания программ на C++ этот вариант гораздо предпочтительней, чем использования метода scanf, т. к. обеспечивает гораздо больший контроль за типами на этапе компиляции. Ожидаемый формат числа можно указать с помощью флага формата:<br>
<strong class='tag-b'>dec - </strong>целое в десятичном формате;<br>
<strong class='tag-b'>hex</strong> - целое в шестнадцатеричном формате;<br>
<strong class='tag-b'>oct</strong> - целое в восьмеричном формате;<br>
<strong class='tag-b'>scientific - </strong>число с плавающей точкой в экспоненциальном формате;<br>
<strong class='tag-b'>fixed - </strong>число с плавающей точкой в фиксированном формате.<br>
При этом форматы для целых чисел и чисел с плавающей точкой устанавливаются независимо друг от друга.<br>
В случае получения результатов ввода пользователя из строки редактирования (EditBox, CEdit) имеет смысл пользоваться методом <strong class='tag-b'>GetDlgItemInt</strong>:<br>
<br>
<span class='tag-size' data-value='12' style='font-size:12pt;'><span class="tag-font" data-value="Courier" style="font-family:Courier">UINT <strong class='tag-b'><em class='tag-i'>GetDlgItemInt</em></strong>(HWND <em class='tag-i'>hDlg</em>, <strong class='tag-b'>int</strong> <em class='tag-i'>itemId</em>, BOOL* <em class='tag-i'>pTranslated</em>, BOOL <em class='tag-i'>signed</em>)<br>
UNIT <strong class='tag-b'><em class='tag-i'>CWnd::GetDlgItemInt</em></strong>(<strong class='tag-b'>int</strong> <em class='tag-i'>itemId</em>, BOOL* <em class='tag-i'>pTranslated</em>, BOOL <em class='tag-i'>signed</em>)</span></span><br>
<br>
Первым параметром в API-вызов передается хэндл диалогового окна, которому принадлежит строка редактирования. Параметр itemId задает идентификатор строки ввода, через pTranslated возвращается признак того, что введенная пользователем строка успешно проинтерпретирована как целое число. Параметром signed задается необходимость получения в качестве результата функции знакового числа.<br>
Для преобразования экземпляра класса CString в число можно воспользоваться любым из предложенных выше методов, т. к. CString без труда преобразуется в указатель на null-terminated-строку. Специальных методов для этого класса разработчиками библиотеки не предусмотрено.<br>
В VCL ситуация чуть лучше. Для класса AnsiString из этой библиотеки определены следующие методы, позволяющие получить число из его строкового представления:<br>
<strong class='tag-b'>ToInt</strong> - простое преобразование строки в целое число;<br>
<strong class='tag-b'>ToDouble</strong> - преобразует строку в число с плавающей точкой. Формат разделительных символов читается из региональных настроек системы.<br>
Оба метода (в случае несоответствие строки формату числа) выбрасывают исключение. Также стоит обратить внимание на метод <strong class='tag-b'>ToIntDef</strong>, который (в случае неудачного преобразования) возвращает значение по умолчанию, переданное ему в качестве параметра.<br>
Вот основные библиотечные и API-функции, которые можно использовать для преобразования строки в число.<br>
<br>
<span class='tag-size' data-value='13' style='font-size:13pt;'><strong class='tag-b'><em class='tag-i'>Преобразование числа в строку</em></strong></span><br>
<br>
К сожалению, стандартной <em class='tag-i'>специализированной</em> функции (описанной в стандарте языка) для обратного преобразования (числа в строку) не существует. Но это не значит, что таких функций нет в RTL компиляторов. Для преобразования целого числа в строку можно воспользоваться следующими функциями:<br>
<br>
<span class='tag-size' data-value='12' style='font-size:12pt;'><span class="tag-font" data-value="Courier" style="font-family:Courier"><strong class='tag-b'>char</strong>* <strong class='tag-b'><em class='tag-i'>_itoa</em></strong>(<strong class='tag-b'>int</strong> <em class='tag-i'>value</em>, <strong class='tag-b'>char</strong>* <em class='tag-i'>string</em>, <strong class='tag-b'>int</strong> <em class='tag-i'>radix</em>);<br>
<strong class='tag-b'>wchar_t</strong>* <strong class='tag-b'><em class='tag-i'>_itow</em></strong>(<strong class='tag-b'>int</strong> <em class='tag-i'>value</em>, <strong class='tag-b'>wchar_t</strong>* <em class='tag-i'>string</em>, <strong class='tag-b'>int</strong> <em class='tag-i'>radix</em>);<br>
<strong class='tag-b'>char</strong>* <strong class='tag-b'><em class='tag-i'>_ltoa</em></strong>(<strong class='tag-b'>long</strong> <em class='tag-i'>value</em>, <strong class='tag-b'>char</strong>* <em class='tag-i'>string</em>, <strong class='tag-b'>int</strong> <em class='tag-i'>radix</em>);<br>
<strong class='tag-b'>wchar_t</strong>* <strong class='tag-b'><em class='tag-i'>_ltow</em></strong>(<strong class='tag-b'>long</strong> <em class='tag-i'>value</em>, <strong class='tag-b'>wchar_t</strong>* <em class='tag-i'>string</em>, <strong class='tag-b'>int</strong> <em class='tag-i'>radix</em>);<br>
<strong class='tag-b'>char</strong>* <strong class='tag-b'><em class='tag-i'>_ultoa</em></strong>(<strong class='tag-b'>unsigned long </strong><em class='tag-i'>value</em>, <strong class='tag-b'>char</strong>* <em class='tag-i'>string</em>, <strong class='tag-b'>int</strong> <em class='tag-i'>radix</em>);<br>
<strong class='tag-b'>wchar_t</strong>* <strong class='tag-b'><em class='tag-i'>_ultow</em></strong>(<strong class='tag-b'>unsigned long</strong> <em class='tag-i'>value</em>, <strong class='tag-b'>wchar_t</strong>* <em class='tag-i'>string</em>, <strong class='tag-b'>int</strong> <em class='tag-i'>radix</em>);</span></span><br>
<br>
эти функции входят в библиотеку компиляторов от Microsoft.<br>
Для компиляторов фирмы Borland можно использовать следующие функции:<br>
<br>
<span class='tag-size' data-value='12' style='font-size:12pt;'><span class="tag-font" data-value="Courier" style="font-family:Courier"><strong class='tag-b'>char</strong>* <strong class='tag-b'><em class='tag-i'>itoa</em></strong>(<strong class='tag-b'>int</strong> <em class='tag-i'>value</em>, <strong class='tag-b'>char</strong>* <em class='tag-i'>string</em>, <strong class='tag-b'>int</strong> <em class='tag-i'>radix</em>);<br>
<strong class='tag-b'>wchar_t</strong>* <strong class='tag-b'><em class='tag-i'>_itow</em></strong>(<strong class='tag-b'>int</strong> <em class='tag-i'>value</em>, <strong class='tag-b'>wchar_t</strong>* <em class='tag-i'>string</em>, <strong class='tag-b'>int</strong> <em class='tag-i'>radix</em>);<br>
<strong class='tag-b'>char</strong>* <strong class='tag-b'><em class='tag-i'>ltoa</em></strong>(<strong class='tag-b'>long</strong> <em class='tag-i'>value</em>, <strong class='tag-b'>char</strong>* <em class='tag-i'>string</em>, <strong class='tag-b'>int</strong> <em class='tag-i'>radix</em>);<br>
<strong class='tag-b'>char</strong>* <strong class='tag-b'><em class='tag-i'>_ltoa</em></strong>(<strong class='tag-b'>long</strong> <em class='tag-i'>value</em>, <strong class='tag-b'>char</strong>* <em class='tag-i'>string</em>, <strong class='tag-b'>int</strong> <em class='tag-i'>radix</em>);<br>
<strong class='tag-b'>wchar_t</strong>* <strong class='tag-b'><em class='tag-i'>_ltow</em></strong>(<strong class='tag-b'>long</strong> <em class='tag-i'>value</em>, <strong class='tag-b'>wchar_t</strong>* <em class='tag-i'>string</em>, <strong class='tag-b'>int</strong> <em class='tag-i'>radix</em>);<br>
<strong class='tag-b'>char</strong>* <strong class='tag-b'><em class='tag-i'>ultoa</em></strong>(<strong class='tag-b'>unsigned long</strong> <em class='tag-i'>value</em>, <strong class='tag-b'>char</strong>* <em class='tag-i'>string</em>, <strong class='tag-b'>int</strong><em class='tag-i'>radix</em>);<br>
<strong class='tag-b'>wchar_t</strong>* <strong class='tag-b'><em class='tag-i'>_ultow</em></strong>(<strong class='tag-b'>unsigned long</strong> <em class='tag-i'>value</em>, <strong class='tag-b'>wchar_t</strong>* <em class='tag-i'>string</em>, <strong class='tag-b'>int</strong> <em class='tag-i'>radix</em>);</span></span><br>
<br>
Как можно видеть - в компиляторах семейства Microsoft и Borland имена функций отличаются не сильно и формируются по следующему принципу:<br>
[_]<em class='tag-i'>исходный_тип</em>to<em class='tag-i'>формат_строки</em>. Исходные типы представлены следующими аббревиатурами:<br>
<strong class='tag-b'>i</strong> - int;<br>
<strong class='tag-b'>l</strong> - long;<br>
<strong class='tag-b'>ul</strong> - unsigned long;<br>
<strong class='tag-b'>i64</strong> - int64;<br>
<strong class='tag-b'>ui64</strong> - unsigned int 64;<br>
формат строки, соответственно:<br>
<strong class='tag-b'>a</strong> - однобайтный char (ANSI);<br>
<strong class='tag-b'>w</strong> - wide-char (Unicode).<br>
Параметры, принимаемые на вход, имеют следующий смысл. Первый параметр (value) - это значение, которое необходимо преобразовать в строку. Второй (string) - буфер, в который будет помещен результат преобразования. А третий (radix) - основание системы счисления, в которой будет представлено число.<br>
Сказав выше, что нет стандартных функций преобразования числа в строку, я немного лукавил, так как имел в виду именно <em class='tag-i'>специализированные </em>функции - аналоги <strong class='tag-b'>atoi</strong> и <strong class='tag-b'>strtol</strong>. К неспециализированным стандартным функциям, выполняющим необходимое преобразование, можно отнести функцию <strong class='tag-b'>sprintf</strong>:<br>
<br>
<span class='tag-size' data-value='12' style='font-size:12pt;'><span class="tag-font" data-value="Courier" style="font-family:Courier"><strong class='tag-b'>int</strong> <strong class='tag-b'><em class='tag-i'>sprintf</em></strong>(<strong class='tag-b'>char</strong>* <em class='tag-i'>buffer</em>, <strong class='tag-b'>const char</strong>*<em class='tag-i'> format</em> [, <em class='tag-i'>argument</em>] ... );</span></span><br>
<br>
выполняющую форматированный вывод в заданный буфер, а также другие функции из этого семейства. Для необходимого нам преобразования необходимо воспользоваться форматной строкой &quot;%d&quot;. При этом будет выполнено стандартное преобразование в десятичное представление числа, аналогичное предыдущим функциям. Формат полученного числа определяется тэгом типа. Существуют следующие тэги типов:<br>
<strong class='tag-b'>d</strong> (или <strong class='tag-b'>i</strong>) - знаковое целое в десятичном формате;<br>
<strong class='tag-b'>u</strong> - беззнаковое целое в десятичном формате;<br>
<strong class='tag-b'>o</strong> - беззнаковое целое в восьмеричном формате;<br>
<strong class='tag-b'>x </strong>(или<strong class='tag-b'> X</strong>) - беззнаковое целое в шестнадцатеричном формате.<br>
Можно использовать также специальные спецификаторы тэгов типа (указываются непосредственно перед тэгом) для того, чтобы указать специальный формат, в котором передано число:<br>
<strong class='tag-b'>l</strong> - передано длинное целое (signed/unsigned long);<br>
<strong class='tag-b'>h</strong> - передано короткое целое (signed/unsigned short); <br>
<strong class='tag-b'>l64</strong> (для Microsoft) или <strong class='tag-b'>L</strong> (для Borland) - передано 64-битное целое (signed/unsigned __int64).<br>
Вообще говоря, при использовании спецификатора типа h необходимо понимать, что при передаче в функцию printf переменных типа short (по стандарту) продвигаются до типа int. Таким образом, этот спецификатор просто дает указание функции форматирование игнорировать старшие разряды полученного целого параметра.<br>
Функции форматного вывода хороши тем, что им можно явно указать формат, в котором мы хотим получить результат. В частности, форматная строка &quot;%08x&quot; преобразует переданное число в строку, содержащую шестнадцатеричное представление числа шириной 8 символов, при этом, при необходимости, строка будет дополнена слева незначащими нулями до 8 символов. Также достоинством этих функций (перед предыдущей группой) является то, что строка преобразуется в соответствии с установленными <em class='tag-i'>для программы </em>(с помощью вызова функции <strong class='tag-b'>setlocale</strong>) региональными настройками (locales). <br>
К основным недостаткам методов форматного вывода можно отнести их низкую скорость работы (на порядок медленней их специализированных аналогов), невозможность преобразования в системы счисления, отличные от восьмеричной, десятичной, и шестнадцатеричной, а также отсутствия контроля за типами и размером переданного буфера, что может приводить к трудновыявляемым ошибкам. <br>
Для перевода чисел с плавающей точкой предназначены следующие методы:<br>
<br>
<span class='tag-size' data-value='12' style='font-size:12pt;'><span class="tag-font" data-value="Courier" style="font-family:Courier"><strong class='tag-b'>char</strong>* <strong class='tag-b'><em class='tag-i'>_ecvt</em></strong>(<strong class='tag-b'>double</strong> <em class='tag-i'>value</em>, <strong class='tag-b'>int</strong> <em class='tag-i'>count</em>, <strong class='tag-b'>int</strong>* <em class='tag-i'>dec</em>, <strong class='tag-b'>int</strong>* <em class='tag-i'>sign</em>);<br>
<strong class='tag-b'>char</strong>* <strong class='tag-b'><em class='tag-i'>_fcvt</em></strong>(<strong class='tag-b'>double</strong> <em class='tag-i'>value</em>, <strong class='tag-b'>int</strong> <em class='tag-i'>count</em>, <strong class='tag-b'>int</strong>* <em class='tag-i'>dec</em>, <strong class='tag-b'>int</strong>* <em class='tag-i'>sign</em>);<br>
<strong class='tag-b'>char</strong>* <strong class='tag-b'><em class='tag-i'>_gcvt</em></strong>(<strong class='tag-b'>double</strong> <em class='tag-i'>value</em>, <strong class='tag-b'>int</strong> <em class='tag-i'>digits</em>, <strong class='tag-b'>char</strong>* <em class='tag-i'>buffer</em>);</span></span><br>
<br>
- для Microsoft-компиляторов и<br>
<br>
<span class='tag-size' data-value='12' style='font-size:12pt;'><span class="tag-font" data-value="Courier" style="font-family:Courier"><strong class='tag-b'>char</strong>* <strong class='tag-b'><em class='tag-i'>ecvt</em></strong>(<strong class='tag-b'>double</strong> <em class='tag-i'>value</em>, <strong class='tag-b'>int</strong> <em class='tag-i'>count</em>, <strong class='tag-b'>int</strong>* <em class='tag-i'>dec</em>, <strong class='tag-b'>int</strong>* <em class='tag-i'>sign</em>);<br>
<strong class='tag-b'>char</strong>* <strong class='tag-b'><em class='tag-i'>fcvt</em></strong>(<strong class='tag-b'>double</strong> <em class='tag-i'>value</em>, <strong class='tag-b'>int</strong> <em class='tag-i'>count</em>, <strong class='tag-b'>int</strong>* <em class='tag-i'>dec</em>, <strong class='tag-b'>int</strong>* <em class='tag-i'>sign</em>);<br>
<strong class='tag-b'>char</strong>* <strong class='tag-b'><em class='tag-i'>gcvt</em></strong>(<strong class='tag-b'>double</strong> <em class='tag-i'>value</em>, <strong class='tag-b'>int</strong> <em class='tag-i'>digits</em>, <strong class='tag-b'>char</strong>* <em class='tag-i'>buffer</em>);</span></span><br>
<br>
для компиляторов от фирмы Borland.<br>
Назначение функций следующее:<br>
Функция <strong class='tag-b'>ecvt</strong> конвертирует число (value) в заданное (count) количество символов, не выполняя при этом никакого форматирования. Через параметр dec возвращается позиция, с которой начинается дробная часть (позиция десятичной точки), начиная с первого символа строки, а через параметр sign - признак того, что число имеет знак. Тут необходимо сделать ряд следующих замечаний:<ol class="tag-list" type="1"><li>Если строковое представление числа уже, чем необходимое количество символов, то число справа дополняется нулями.</li><li>сли строковое представление числа шире, чем необходимое количество символов, то возвращаемая через dec позиция находится правее завершающего строку нуля или левее первого символа строки. Выбор знака dec зависит от знака десятичной экспоненты числа. Например, для value= 3.5678e20 и count=6 функция вернет строку &quot;356780&quot;, а dec будет равно 21. А для значения 3.5678e-20 и 6, будет возвращено, соответственно, &quot;356780&quot; и -19.</li><li>Преобразование производится во внутренний статический буфер, разделяемый с функцией <strong class='tag-b'>fcvt</strong>, по этому необходимо быть осторожным при использовании функции в многопоточной среде.</li></ol>Функция <strong class='tag-b'>fcvt</strong> отличается от <strong class='tag-b'>ecvt</strong> только тем, что параметр count задает не общее число символов, а число символов после десятичной точки (точность представление числа). При этом строковое представление (по необходимости) дополняется справа нулями до получения нужной ширины. Параметры dec и sign ведут себя аналогичным (как и для <strong class='tag-b'>ecvt</strong>) образом. Для приведенных выше примеров возвращенные значения будут &quot;356780000000000000000000000&quot; и 21, а также &quot;&quot; и -19 соответственно. В последнем случае возвращенная пустая строка означает, что строковое представление содержит только нули.<br>
Функция <strong class='tag-b'>gcvt</strong> преобразует заданное число (value) в привычное строковое представление и помещает результат в переданный буфер (buffer). При этом в буфер будет помещено не более digits цифр. Если число может быть представлено таким количеством цифр, то оно будет преобразовано в десятичный (фиксированный) формат, иначе будет выполнено преобразование в экспоненциальный формат, и заданное количество цифр будет содержать мантисса числа. Полученное строковое представление может быть дополнено справа нулями для получения необходимого количества разрядов. <br>
При использовании этой функции необходимо помнить следующее: буфер должен быть достаточно большим, чтобы принять digits цифр, завершающий ноль, а также знак, десятичную точку и экспоненту. Никакого контроля не производится, и граница буфера может быть нарушена. При формировании строки региональные настройки учитываются.<br>
Для вывода чисел с плавающей точкой у функций семейства <strong class='tag-b'>printf</strong> есть следующие тэги типов:<br>
<strong class='tag-b'>е</strong> (или<strong class='tag-b'> Е</strong>) (exponent) - преобразует число в экспоненциальное представление;<br>
<strong class='tag-b'>f</strong> (fixed) - преобразует число в десятичное представление основываясь на дополнительных форматных параметрах (ширина и точность);<br>
<strong class='tag-b'>g</strong> (или <strong class='tag-b'>G</strong>) (general) - преобразует число либо в экспоненциальное, либо в десятичное представление в зависимости от того, какое представление будет короче.<br>
Так же, как и для целых чисел, можно указать дополнительные спецификаторы:<br>
<strong class='tag-b'>L</strong> - передано число в формате long double.<br>
Необходимо заметить, что при передачи переменных типа float производится их продвижение до типа double.<br>
Дополнительно можно указать общее количество значащих цифр в строковом представлении (ширну), а также количество цифр в дробной части (точность) в следующем виде:<br>
%&lt;<em class='tag-i'>ширина</em>&gt;.&lt;<em class='tag-i'>точность</em>&gt;&lt;<em class='tag-i'>тэг_типа</em>&gt;.<br>
Подробнее об этих форматах можно прочитать в документации по форматной строке функций этого семейства, т. к. подробное описание всех возможностей функций семейства printf выходит за рамки этой статьи.<br>
В C++ числа можно конвертировать в символьное представление с помощью операторов потокового вывода (&lt;&lt;). При этом для выводимых чисел можно установить желаемую точность (метод precision) и ширину (метод width). Желаемый формат устанавливается путем вывода в поток соответствующего форматного флага:<br>
<strong class='tag-b'>dec</strong> - целое в десятичном формате;<br>
<strong class='tag-b'>hex</strong> - целое в шестнадцатеричном формате;<br>
<strong class='tag-b'>oct</strong> - целое в восьмеричном формате;<br>
<strong class='tag-b'>scientific </strong> - число с плавающей точкой в экспоненциальном формате;<br>
<strong class='tag-b'>fixed</strong> - число с плавающей точкой в фиксированном формате.<br>
При этом форматы для целых чисел и чисел с плавающей точкой устанавливаются независимо. <br>
При выводе региональные настройки также учитываются, но устанавливать их нужно особым образом, и обсуждение этого вопроса выходит за рамки этой статьи.<br>
Если говорить о возможностях библиотек MFC и VCL, то в MFC единственный способ преобразовать число в строку - это метод <strong class='tag-b'>Format</strong> класса CString. Этот метод работает аналогично методу <strong class='tag-b'>sprintf</strong>.<br>
У VCL в этом плане возможностей больше. У класса AnsiString существуют следующие статические методы:<br>
<strong class='tag-b'>IntToHex</strong> - преобразует число в шестнадцатеричное представление.<br>
<strong class='tag-b'>FormatFloat</strong> - преобразует число с плавающей точкой в строку в соответствии с заданной (в виде строки) маской, что позволяет получать числа практически в любом желаемом формате.<br>
<strong class='tag-b'>FloatToStrF</strong> - преобразует число в строку в соответствии с несколькими самыми распространенными форматами (sffGeneral, sffExponent, sffFixed), которые соответствуют форматам функции sprintf (g, e, f). Также этот метод может добавить в строку разделители тысяч (формат sffNumber), или преобразовать в представление денежных единиц (формат sffCurrency). При этом все разделительные символы, формат числа и т. п. будут взяты из <em class='tag-i'>текущих региональных настроек системы</em>.<br>
Также существуют (но не отражены в документации) нестатические методы класса AnsiString <strong class='tag-b'>sprintf</strong> и <strong class='tag-b'>printf</strong>, аналогичные по возможностям соответствующим RTL-ным, но не принимающие на вход буфер, в качестве которого используется экземпляр класса AnsiString.<br>
В WinAPI (симметрично методу <strong class='tag-b'>GetDlgItemInt</strong>) существует метод <strong class='tag-b'>SetDlgItemInt</strong>, выполняющий необходимые преобразования числа в строку:<br>
<br>
<span class='tag-size' data-value='12' style='font-size:12pt;'><span class="tag-font" data-value="Courier" style="font-family:Courier">UINT <strong class='tag-b'><em class='tag-i'>SetDlgItemInt</em></strong>(HWND <em class='tag-i'>hDlg</em>, <strong class='tag-b'>int</strong> <em class='tag-i'>itemId</em>, UINT <em class='tag-i'>value</em>, BOOL <em class='tag-i'>signed</em>)<br>
UNIT <strong class='tag-b'><em class='tag-i'>CWnd::GetDlgItemInt</em></strong>(<strong class='tag-b'>int</strong> <em class='tag-i'>itemId</em>, UINT <em class='tag-i'>value</em>, BOOL <em class='tag-i'>signed</em>)</span></span><br>
<br>
Последним параметров в эти функции передается признак знаковости числа.<br>
<br>
Вот наверное и все, что можно сказать про штатные функции преобразования. В следующей части будут рассмотрены различные варианты &quot;самописных&quot; функций преобразования.<br>
<br>
Ответил Flex Ferrum.]]></description>
        <author>Flex_Ferrum</author>
        <category>C/C++ FAQ</category>
      </item>
	
      </channel>
      </rss>
	