{"id":1448,"date":"2019-10-18T14:13:28","date_gmt":"2019-10-18T14:13:28","guid":{"rendered":"https:\/\/www.yazilimperver.com\/?p=1448"},"modified":"2019-10-18T14:13:28","modified_gmt":"2019-10-18T14:13:28","slug":"haftalik-c-19-stdfrom_chars-to_chars","status":"publish","type":"post","link":"https:\/\/www.yazilimperver.com\/index.php\/2019\/10\/18\/haftalik-c-19-stdfrom_chars-to_chars\/","title":{"rendered":"Haftal\u0131k C++ 19 \u2013 std::from_chars\/to_chars"},"content":{"rendered":"<p>B\u00c7OM, SOLID, SSL derken haftal\u0131k C++ yaz\u0131lar\u0131n\u0131 unuttu\u011fumu sand\u0131ysan\u0131z b\u00fcy\u00fck yan\u0131lg\u0131 i\u00e7erisindesin \ud83d\ude42 Tabi, en son yazd\u0131\u011f\u0131m yaz\u0131n\u0131n \u00fczerinden bir ka\u00e7 ay ge\u00e7mi\u015f olabilir ama bu seri devam edecek o kadar \ud83d\ude42<\/p>\n<p>Bu k\u0131sa yaz\u0131m\u0131zda, C++ 17 ile birlikte gelen <em><strong>std::from_chars<\/strong><\/em> ve <em><strong>std::to_chars<\/strong><\/em> API&#8217;lerine bir g\u00f6z ataca\u011f\u0131z. Bu API&#8217;ler bize ne kazand\u0131r\u0131yor, daha \u00f6nce bu anlamda sunulan mekanizmalar nelerdi? Bu API&#8217;ye neden ihtiya\u00e7 duyuldu ve tabi ki \u00f6rnek kodlar. \u00d6ncelikli olarak mevcut metin\/say\u0131 ve benzeri d\u00f6n\u00fc\u015f\u00fcmler i\u00e7in sunulan mekanizmalar ile ba\u015flayal\u0131m.<\/p>\n<h2><span style=\"color: #0000ff;\"><strong>Metin\/Say\u0131 d\u00f6n\u00fc\u015f\u00fcmleri<\/strong><\/span><\/h2>\n<p>\u015eimdi h\u0131zl\u0131ca, metin say\u0131 ve benzeri d\u00f6n\u00fc\u015f\u00fcmler i\u00e7in kullan\u0131labilecek mevcut API&#8217;lere madde madde, \u00f6rnek kullan\u0131mlar\u0131 ile bakal\u0131m. Bu anlamda s\u0131rlayaca\u011f\u0131m\u0131z her bir API i\u00e7in genel kullan\u0131m amac\u0131, \u00f6zel durumlar\u0131 ve \u00f6rnek kullan\u0131mlar\u0131ndan, yerel (&#8220;<em>locale&#8221;)\u00a0<\/em>deste\u011fi olup\/olmamas\u0131 ve hata durumlar\u0131ndan da bahsedece\u011fiz. Bu hususlar ile hem bu API&#8217;leri hat\u0131rlam\u0131\u015f oluruz hem de yeni gelen API ile farklar\u0131n\u0131 daha net g\u00f6rebiliriz.<\/p>\n<p>\u0130lgili API&#8217;lere ge\u00e7meden \u00f6nce dikkatinizi \u00e7ekebilece\u011fini d\u00fc\u015f\u00fcnd\u00fc\u011f\u00fcm ve daha \u00f6nce duymam\u0131\u015f olabilece\u011finiz yerel (&#8220;<em>locale<\/em>&#8220;) deste\u011finden bahsetmek istiyorum.<\/p>\n<p>Bu kabiliyet temelinde, karakter s\u0131n\u0131fland\u0131rmas\u0131 ve metinlerin kullan\u0131m\u0131, say\u0131sal, parasal ve tarih\/saat bi\u00e7imlendirme ve ayr\u0131\u015ft\u0131rma ve son olarak mesaj al\u0131m\u0131 i\u00e7in uluslararas\u0131la\u015fma deste\u011fini bir tak\u0131m ayarlamalar arac\u0131l\u0131\u011f\u0131 ile kapsar. Windows ve di\u011fer i\u015fletim sistemi kullan\u0131c\u0131lar\u0131n\u0131n bir \u00e7o\u011funun buna vak\u0131f oldu\u011funu d\u00fc\u015f\u00fcn\u00fcyorum. Bu yerel ayarlar, I\/O, &#8220;regular expressions&#8221; ve di\u011fer bir tak\u0131m C++ standart k\u00fct\u00fcphanelerinin davran\u0131\u015flar\u0131n\u0131 etkiler. Bu kabiliyet ile ilgili k\u00fct\u00fcphane <code>&lt;locale&gt;<\/code>\u00a0ba\u015fl\u0131k dosyas\u0131 i\u00e7erisinde toplanm\u0131\u015ft\u0131r ve burada s\u0131ralayaca\u011f\u0131m bir tak\u0131m API ve k\u00fct\u00fcphanelerin bir k\u0131sm\u0131 bunu kullan\u0131rken bir k\u0131sm\u0131 da kullanmamaktad\u0131r. H\u0131zl\u0131ca bu kabiliyete \u00f6rnek bir kod \u00fczerinden bakal\u0131m:<\/p>\n<pre class=\"lang:c++ decode:true\">#include &lt;iostream&gt; \/\/ cin, cout vs.\r\n#include &lt;sstream&gt;\r\n#include &lt;iterator&gt;\r\n#include &lt;locale&gt; \/\/ T\u00fcrk\u00e7e karakterler\r\n\r\nusing namespace std; \/\/ std::\r\n\r\nint main()\r\n{\r\n\t\/\/ Mevcut sistem yerel atamasini gosterir\r\n\tcout &lt;&lt; \"Current locale: \" &lt;&lt; std::locale().name() &lt;&lt; endl;\r\n\r\n\t\/\/ Mevcut yerel ayarlari ile turkce karakterleri basamayiz\r\n\tcout &lt;&lt; \"T\u00fcrk\u00e7e (\u0131, \u011f, \u00fc, \u015f, \u00f6, \u00e7) karakterleri kullanabiliriz.\\n\" &lt;&lt; endl;\r\n\t\r\n\t\/\/ Mevcut yerel atamasini turkceye cevirelim\r\n\tstd::locale::global(std::locale(\"tr_TR\"));\r\n\r\n\t\/\/ Bu arada ilgili yerellestirme API'sinin C versiyonu da asagidaki gibidir. \r\n\t\/\/ Uygulamanin tamaminda gecerli olacak sekilde yeni yerellestirmeyi atar.\r\n\t\/\/setlocale(LC_ALL, \"turkish\"); \r\n\t\r\n\t\/\/ Mevcut sistem yerel atamasini gosterir\r\n\tcout &lt;&lt; \"Updated locale: \" &lt;&lt; std::locale().name() &lt;&lt; endl;\r\n\r\n\t\/\/ Turkce karakterlere sahip metinleri gosterebiliyoruz\r\n\tcout &lt;&lt; \"T\u00fcrk\u00e7e (\u0131, \u011f, \u00fc, \u015f, \u00f6, \u00e7) karakterler kullanabiliriz.\\n\" &lt;&lt; endl;\r\n\t\r\n\t\/\/ Bir de fransiz yerel atamas\u0131 yapalim\r\n\tstd::locale::global(std::locale(\"Fr_CH\"));\r\n\tcout &lt;&lt; \"Updated locale: \" &lt;&lt; std::locale().name() &lt;&lt; endl;\r\n\r\n\t\/\/ Simdi bu yerellestirme ayarlarinin sayilarda basimiza neler acabilecegine bakalim\r\n\tstd::string de_double = \"1.234.567,89\";\r\n\tstd::string us_double = \"1,234,567.89\";\r\n\r\n\t\/\/ Sayilari stream araciligi ile parse edelim\r\n\tstd::istringstream de_in(de_double);\r\n\tde_in.imbue(std::locale(\"de_DE\"));\r\n\tdouble f1;\r\n\tde_in &gt;&gt; f1;\r\n\r\n\tstd::istringstream us_in(de_double);\r\n\tus_in.imbue(std::locale(\"en_US.UTF-8\"));\r\n\tdouble f2;\r\n\tus_in &gt;&gt; f2;\r\n\r\n\t\/* Ikisinin nasil farkli ayristirildigina bakalim *\/\r\n\tstd::cout &lt;&lt; \"Parsing \" &lt;&lt; de_double &lt;&lt; \" as double gives \" &lt;&lt; std::fixed\r\n\t\t&lt;&lt; f1 &lt;&lt; \" in de_DE locale and \" &lt;&lt; f2 &lt;&lt; \" in en_US locale :) \\n\";\r\n\treturn 0;\r\n}<\/pre>\n<p>Bu konu ile ilgili daha detayl\u0131 bilgiye ve sunulan di\u011fer API&#8217;lere (ki olduk\u00e7a fazla API var)\u00a0<span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/en.cppreference.com\/w\/cpp\/locale\">https:\/\/en.cppreference.com\/w\/cpp\/locale<\/a><\/strong><\/span> sayfas\u0131ndan ula\u015fabilirsiniz. Asl\u0131nda \u015fimdi d\u00fc\u015f\u00fcn\u00fcyorum, bu konu da ayr\u0131 bir yaz\u0131y\u0131 hak ediyor sanki ne dersiniz \ud83d\ude42 Bakal\u0131m hay\u0131rl\u0131s\u0131.<\/p>\n<p>Gelelim \u015fimdi d\u00f6n\u00fc\u015f\u00fcmler i\u00e7in kullanabilece\u011fimiz API&#8217;lere:<\/p>\n<ul>\n<li><span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/en.cppreference.com\/w\/cpp\/io\/c\/fprintf\">sprintf<\/a><\/strong><\/span>:\n<ul>\n<li>Fonksiyon:\n<ul>\n<li>int sprintf( char* buffer, const char* format, &#8230; )<\/li>\n<\/ul>\n<\/li>\n<li>\u00c7ok me\u015fhur <em>printf<\/em>() API&#8217;sinin metin formatlamak i\u00e7in kullan\u0131labilecek kay\u0131n\u00e7osu. Bir de dosyalar i\u00e7in kullan\u0131labilecek fprintf eni\u015fte de var ama o bu yaz\u0131m\u0131z\u0131n he\u00e7 konusu de\u011fil,<\/li>\n<li>Yerelle\u015ftirme deste\u011fi var ve geni\u015f karakter deste\u011fi de sunuyor,<\/li>\n<li>D\u00f6n\u00fc\u015f\u00fcm yan\u0131nda formatlama,<\/li>\n<li>Yukar\u0131daki kabiliyetler neticesinde biraz i\u015flem maliyeti var,<\/li>\n<li>Tampon a\u015f\u0131m\u0131\/g\u00fcvenlik riski mevcut,<\/li>\n<li>Bu API&#8217;ler&#8217;n ayr\u0131ca daha g\u00fcvenli hale getirilmi\u015f ve &#8220;_s&#8221; tak\u0131s\u0131 ile isimlendirilen \u015fekilleri de mevcut,<\/li>\n<li>\n<pre class=\"lang:c++ decode:true\">#include &lt;stdio.h&gt;\r\n\r\nint main ()\r\n{\r\n  char buffer [50];\r\n  int n;\r\n  int a{5};\r\n  int b{3};\r\n\r\n  n=sprintf (buffer, \"%d plus %d is %d\", a, b, a+b);\r\n  printf (\"[%s] is a string %d chars long\\n\",buffer,n);\r\n  return 0;\r\n}<\/pre>\n<\/li>\n<\/ul>\n<\/li>\n<li><strong><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"http:\/\/www.cplusplus.com\/reference\/cstdio\/snprintf\/\">snprintf<\/a><\/span>:<\/strong>\n<ul>\n<li>Fonskiyon:\n<ul>\n<li>int snprintf(char *str, size_t size, const char *format, &#8230;)<\/li>\n<\/ul>\n<\/li>\n<li>sprintf&#8217;in kuzeni. Ek olarak tampon boyutu al\u0131r ama kabiliyetin nas\u0131l ger\u00e7eklendi\u011fi sisteme ba\u011f\u0131ml\u0131 oluyor genelde,<\/li>\n<li>Benzer maliyetler bu API i\u00e7in de ge\u00e7erli,<\/li>\n<li>\n<pre class=\"lang:c++ decode:true \">#include &lt;cstdio&gt;\r\n#include &lt;iostream&gt;\r\nusing namespace std;\r\nint main()\r\n{\r\n    char buffer[100];\r\n    int retVal, buf_size = 100;\r\n    char name[] = \"Max\";\r\n    int age = 23;\r\n    retVal = snprintf(buffer, buf_size, \"Hi, I am %s and I am %d years old\", name, age);\r\n    if (retVal &gt; 0 &amp;&amp; retVal &lt; buf_size)\r\n    {\r\n        cout &lt;&lt; buffer &lt;&lt; endl;\r\n        cout &lt;&lt; \"Number of characters written = \" &lt;&lt; retVal &lt;&lt; endl;\r\n    }\r\n    else\r\n        cout &lt;&lt; \"Error writing to buffer\" &lt;&lt; endl;\r\n    return 0;\r\n}<\/pre>\n<\/li>\n<\/ul>\n<\/li>\n<li><strong><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/en.cppreference.com\/w\/c\/io\/fscanf\">sscanf<\/a><\/span>:<\/strong>\n<ul>\n<li>Fonskiyon:\n<ul>\n<li>int sscanf(const char *str, const char *format, &#8230;)<\/li>\n<\/ul>\n<\/li>\n<li>Asl\u0131nda sprintf&#8217;e benzeyen fakat, tabiri caizse, ters y\u00f6nde \u00e7al\u0131\u015fan bir API,<\/li>\n<li>sprintf API&#8217;sinde ilgili say\u0131lar\u0131 metine \u00e7evirirken, bu API ile birlikte metin olarak tutulan say\u0131lar\u0131, verilen formata g\u00f6re de\u011fi\u015fkenlere at\u0131lmas\u0131na olanak sa\u011flanmakta,<\/li>\n<li>\u00d6nceki iki API gibi yerelle\u015ftirme deste\u011fi sunulmakta,<\/li>\n<li>\n<pre class=\"lang:c++ decode:true \">#include &lt;stdio.h&gt;\r\n#include &lt;stdlib.h&gt;\r\n#include &lt;string.h&gt;\r\n\r\nint main () \r\n{\r\n   int day, year;\r\n   char weekday[20], month[20], dtm[100];\r\n\r\n   strcpy( dtm, \"Saturday March 25 1989\" );\r\n   sscanf( dtm, \"%s %s %d  %d\", weekday, month, &amp;day, &amp;year );\r\n\r\n   printf(\"%s %d, %d = %s\\n\", month, day, year, weekday );\r\n    \r\n   return(0);\r\n}<\/pre>\n<\/li>\n<\/ul>\n<\/li>\n<li><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/en.cppreference.com\/w\/cpp\/string\/byte\/atoi\"><strong>atol\/atoi\/atoll:<\/strong><\/a><\/span>\n<ul>\n<li>Fonksiyon:\n<ul>\n<li>int atoi( const char *str )<\/li>\n<li>long int atol(const char* str)<\/li>\n<li><span class=\"kw4\">long<\/span>\u00a0<span class=\"kw4\">long<\/span>\u00a0atoll<span class=\"br0\">(<\/span>\u00a0<span class=\"kw4\">const<\/span>\u00a0<span class=\"kw4\">char<\/span>\u00a0<span class=\"sy2\">*<\/span>str\u00a0<span class=\"br0\">)<\/span><\/li>\n<\/ul>\n<\/li>\n<li>Verilen metinin temsil etti\u011fi say\u0131ya d\u00f6n\u00fc\u015f\u00fcm\u00fcn\u00fc ger\u00e7ekle\u015ftirir. Bunu yaparken, ilk bo\u015fluk olmayan karaktere gelene kadar, bo\u015fluklar\u0131 g\u00f6z ard\u0131 eder,<\/li>\n<li>E\u011fer d\u00f6n\u00fc\u015ft\u00fcr\u00fclen de\u011fer, s\u0131n\u0131rlar d\u0131\u015f\u0131nda ise tan\u0131ml\u0131 bir d\u00f6n\u00fc\u015f de\u011feri yoktur,<\/li>\n<li>D\u00f6n\u00fc\u015f hi\u00e7 yap\u0131lamaz ise 0 d\u00f6n\u00fcl\u00fcr,<\/li>\n<li>Yerelle\u015ftirme ayarlar\u0131ndan etkilenir.<\/li>\n<li>\n<pre class=\"lang:c++ decode:true\">#include &lt;iostream&gt;\r\n#include &lt;cstdlib&gt;\r\n \r\nint main()\r\n{\r\n    const char *str1 = \"42\";\r\n    const char *str2 = \"3.14159\";\r\n    const char *str3 = \"31337 with words\";\r\n    const char *str4 = \"words and 2\";\r\n \r\n    int num1 = std::atoi(str1);\r\n    int num2 = std::atoi(str2);\r\n    int num3 = std::atoi(str3);\r\n    int num4 = std::atoi(str4);\r\n    \/\/ std::atoi(\"42\") is 42\r\n    std::cout &lt;&lt; \"std::atoi(\\\"\" &lt;&lt; str1 &lt;&lt; \"\\\") is \" &lt;&lt; num1 &lt;&lt; '\\n';\r\n    \r\n    \/\/ std::atoi(\"3.14159\") is 3\r\n    std::cout &lt;&lt; \"std::atoi(\\\"\" &lt;&lt; str2 &lt;&lt; \"\\\") is \" &lt;&lt; num2 &lt;&lt; '\\n';\r\n\r\n    \/\/ std::atoi(\"31337 with words\") is 31337\r\n    std::cout &lt;&lt; \"std::atoi(\\\"\" &lt;&lt; str3 &lt;&lt; \"\\\") is \" &lt;&lt; num3 &lt;&lt; '\\n';\r\n\r\n    \/\/ std::atoi(\"words and 2\") is 0\r\n    std::cout &lt;&lt; \"std::atoi(\\\"\" &lt;&lt; str4 &lt;&lt; \"\\\") is \" &lt;&lt; num4 &lt;&lt; '\\n';\r\n}<\/pre>\n<\/li>\n<\/ul>\n<\/li>\n<li><strong><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/en.cppreference.com\/w\/cpp\/string\/byte\/strtol\">strtol<\/a><\/span>:<\/strong>\n<ul>\n<li>Fonksiyon:\n<ul>\n<li>long int strtol(const char *str, char **endptr, int base)<\/li>\n<\/ul>\n<\/li>\n<li>Bu API, metin olarak verilen girdiyi, bir \u00f6nceki API&#8217;de oldu\u011fu gibi ilk bo\u015fluk olmayan karaktere kadar ilerler ve say\u0131 ise ilgili say\u0131y\u0131 (long int) d\u00f6ner ve ge\u00e7irilen di\u011fer i\u015faret\u00e7iyi say\u0131dan sonraki ilk karakteri g\u00f6sterecek \u015fekilde g\u00fcnceller,<\/li>\n<li>Ge\u00e7irilen say\u0131 s\u0131n\u0131f\u0131 parametresine g\u00f6re ilgili de\u011feri d\u00f6ner,<\/li>\n<li>E\u011fer d\u00f6n\u00fc\u015ft\u00fcr\u00fclen de\u011fer, s\u0131n\u0131rlar d\u0131\u015f\u0131nda ise LONG_MAX ya da LONG_MIN d\u00f6n\u00fcl\u00fcr,<\/li>\n<li>D\u00f6n\u00fc\u015f hi\u00e7 yap\u0131lamaz ise 0 d\u00f6n\u00fcl\u00fcr,<\/li>\n<li>E\u011fer ge\u00e7irilen metin ge\u00e7erli bir metin dizilimine sahip de\u011filse ya da endptr ge\u00e7erli de\u011filse sonu\u00e7 tan\u0131ms\u0131zd\u0131r,<\/li>\n<li>Yerelle\u015ftirme ayarlar\u0131ndan etkilenir,<\/li>\n<li>\n<pre class=\"lang:c++ decode:true \">int main()\r\n{\r\n    const char* p = \"10 200000000000000000000000000000 30 -40\";\r\n    char *end;\r\n    \/\/ Parsing '10 200000000000000000000000000000 30 -40':\r\n    \/\/ '10' -&gt; 10\r\n    \/\/ ' 200000000000000000000000000000' -&gt; range error, got 9223372036854775807\r\n    \/\/ ' 30' -&gt; 30\r\n    \/\/ ' -40' -&gt; -40\r\n    std::cout &lt;&lt; \"Parsing '\" &lt;&lt; p &lt;&lt; \"':\\n\";\r\n    for (long i = std::strtol(p, &amp;end, 10);\r\n         p != end;\r\n         i = std::strtol(p, &amp;end, 10))\r\n    {\r\n        std::cout &lt;&lt; \"'\" &lt;&lt; std::string(p, end-p) &lt;&lt; \"' -&gt; \";\r\n        p = end;\r\n        if (errno == ERANGE){\r\n            std::cout &lt;&lt; \"range error, got \";\r\n            errno = 0;\r\n        }\r\n        std::cout &lt;&lt; i &lt;&lt; '\\n';\r\n    }\r\n}<\/pre>\n<\/li>\n<\/ul>\n<\/li>\n<li><strong>std::strstream:<\/strong>\n<ul>\n<li>C++ 98 den bu yana art\u0131k kullan\u0131lmas\u0131 tavisye edilmiyor ve onaylanmam\u0131\u015f olarak i\u015faretlenmi\u015f. Bunun yerine\u00a0std::stringstream kullan\u0131lmas\u0131 tavsiye edilmekte, o sebeple bunun \u00fczerinde durmayaca\u011f\u0131z.<\/li>\n<\/ul>\n<\/li>\n<li><span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/en.cppreference.com\/w\/cpp\/io\/basic_stringstream\">std::stringstream<\/a>:<\/strong><\/span>\n<ul>\n<li>Temel olarak &gt;&gt; ve &lt;&lt; ak\u0131\u015f operat\u00f6rlerini kullanarak, metin de\u011fi\u015fkenlerinden numerik veya benzeri verileri okuyup\/yazmaya yararlar,<\/li>\n<li>Bo\u015fluklar\u0131 g\u00f6z ard\u0131 ederler,<\/li>\n<li>Dinamik bellek kullan\u0131m\u0131 vard\u0131r ve yukar\u0131daki API&#8217;lere g\u00f6re daha fazla i\u015f y\u00fck\u00fcne sahiptirler,<\/li>\n<li>Yerelle\u015ftirme ayarlar\u0131ndan etkilenir,<\/li>\n<li>\n<pre class=\"lang:c++ decode:true \">#include &lt;iostream&gt;\r\n#include &lt;iomanip&gt;\r\n#include &lt;sstream&gt;\r\n \r\nint main()\r\n{\r\n    std::string input = \"41 3.14 false hello world\";\r\n    std::istringstream stream(input);\r\n    int n;\r\n    double f;\r\n    bool b;\r\n \r\n    stream &gt;&gt; n &gt;&gt; f &gt;&gt; std::boolalpha &gt;&gt; b;\r\n    \/\/ n = 41\r\n    std::cout &lt;&lt; \"n = \" &lt;&lt; n &lt;&lt; '\\n'\r\n    \/\/ f = 3.14\r\n              &lt;&lt; \"f = \" &lt;&lt; f &lt;&lt; '\\n'\r\n    \/\/ b = false\r\n              &lt;&lt; \"b = \" &lt;&lt; std::boolalpha &lt;&lt; b &lt;&lt; '\\n';\r\n \r\n    \/\/ Kalan k\u0131sm\u0131n\u0131 da standart girdi \u00e7\u0131kt\u0131 ak\u0131\u015f\u0131na y\u00f6nlendirelim\r\n    \/\/ hello world\r\n    stream &gt;&gt; std::cout.rdbuf();\r\n    std::cout &lt;&lt; '\\n';\r\n}<\/pre>\n<\/li>\n<\/ul>\n<\/li>\n<li><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/en.cppreference.com\/w\/cpp\/string\/basic_string\/to_string\"><strong>std::to_string:<\/strong><\/a><\/span>\n<ul>\n<li>C++ 11 ile aram\u0131z\u0131 kat\u0131lan ve numerik de\u011feleri metine \u00e7eviren en son API&#8217;mizdir kendisi,<\/li>\n<li>Dinamik bellek kullan\u0131r ve yer kalmamas\u0131 durumunda std::bad_alloc hatas\u0131 f\u0131rlatabilir,<\/li>\n<li>\u00d6zellikle ger\u00e7ek say\u0131lar\u0131n d\u00f6n\u00fc\u015f\u00fcm\u00fcnde beklenmedik \u00e7\u0131kt\u0131lar alabilirsiniz,<\/li>\n<li>Yerelle\u015ftirme ayarlar\u0131ndan etkilenir,<\/li>\n<li>\n<pre class=\"lang:c++ decode:true \">#include &lt;iostream&gt;\r\n#include &lt;string&gt;\r\n \r\nint main() \r\n{\r\n    double f = 23.43;\r\n    double f2 = 1e-9;\r\n    double f3 = 1e40;\r\n    double f4 = 1e-40;\r\n    double f5 = 123456789;\r\n    std::string f_str = std::to_string(f);\r\n    std::string f_str2 = std::to_string(f2); \/\/ Note: returns \"0.000000\"\r\n    std::string f_str3 = std::to_string(f3); \/\/ Note: Does not return \"1e+40\".\r\n    std::string f_str4 = std::to_string(f4); \/\/ Note: returns \"0.000000\"\r\n    std::string f_str5 = std::to_string(f5);\r\n    \r\n    \/\/ std::cout: 23.43\r\n    \/\/ to_string: 23.430000\r\n    std::cout &lt;&lt; \"std::cout: \" &lt;&lt; f &lt;&lt; '\\n'\r\n    &lt;&lt; \"to_string: \" &lt;&lt; f_str  &lt;&lt; \"\\n\\n\"\r\n\r\n    \/\/ std::cout: 1e-09\r\n    \/\/ to_string: 0.000000\r\n    &lt;&lt; \"std::cout: \" &lt;&lt; f2 &lt;&lt; '\\n'\r\n    &lt;&lt; \"to_string: \" &lt;&lt; f_str2 &lt;&lt; \"\\n\\n\"\r\n\r\n    \/\/ std::cout: 1e+40\r\n    \/\/ to_string: 10000000000000000303786028427003666890752.000000\r\n    &lt;&lt; \"std::cout: \" &lt;&lt; f3 &lt;&lt; '\\n'\r\n    &lt;&lt; \"to_string: \" &lt;&lt; f_str3 &lt;&lt; \"\\n\\n\"\r\n\r\n    \/\/ std::cout: 1e-40\r\n    \/\/ to_string: 0.000000\r\n    &lt;&lt; \"std::cout: \" &lt;&lt; f4 &lt;&lt; '\\n'\r\n    &lt;&lt; \"to_string: \" &lt;&lt; f_str4 &lt;&lt; \"\\n\\n\"\r\n\r\n    \/\/ std::cout: 1.23457e+08\r\n    \/\/ to_string: 123456789.000000\r\n    &lt;&lt; \"std::cout: \" &lt;&lt; f5 &lt;&lt; '\\n'\r\n    &lt;&lt; \"to_string: \" &lt;&lt; f_str5 &lt;&lt; '\\n';\r\n}<\/pre>\n<\/li>\n<\/ul>\n<\/li>\n<li><span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/en.cppreference.com\/w\/cpp\/string\/basic_string\/stol\">std::stoi<\/a>:<\/strong><\/span>\n<ul>\n<li>Bir \u00f6nceki API tam tersi y\u00f6nde verilen metni ilgili say\u0131 tipine d\u00f6n\u00fc\u015ft\u00fcren ve C++ 11 ile gelen API leri kapsar,<\/li>\n<li>Hatal\u0131 bir girdi durumunda std::invalid_argument, s\u0131n\u0131r d\u0131\u015f\u0131 bir veri durumunda ise std::out_of_range hatalar\u0131n\u0131 f\u0131rlat\u0131r,<\/li>\n<li>\u00d6zellikle ger\u00e7ek say\u0131lar\u0131n d\u00f6n\u00fc\u015f\u00fcm\u00fcnde beklenmedik \u00e7\u0131kt\u0131lar alabilirsiniz,<\/li>\n<li>Dinamik bellek kullan\u0131m\u0131 vard\u0131r,<\/li>\n<li>Yerelle\u015ftirme ayarlar\u0131ndan etkilenir,<\/li>\n<li>\n<pre class=\"lang:c++ decode:true \">#include &lt;iostream&gt;\r\n#include &lt;string&gt;\r\n \r\nint main()\r\n{\r\n    std::string str1 = \"45\";\r\n    std::string str2 = \"3.14159\";\r\n    std::string str3 = \"31337 with words\";\r\n    std::string str4 = \"words and 2\";\r\n \r\n    int myint1 = std::stoi(str1);\r\n    int myint2 = std::stoi(str2);\r\n    int myint3 = std::stoi(str3);\r\n    \/\/ Hata: 'std::invalid_argument' ilk bosluk olmayan karakter sayi degil\r\n    \/\/ int myint4 = std::stoi(str4);\r\n \r\n    \/\/ std::stoi(\"45\") is 45\r\n    std::cout &lt;&lt; \"std::stoi(\\\"\" &lt;&lt; str1 &lt;&lt; \"\\\") is \" &lt;&lt; myint1 &lt;&lt; '\\n';\r\n\r\n    \/\/ std::stoi(\"3.14159\") is 3\r\n    std::cout &lt;&lt; \"std::stoi(\\\"\" &lt;&lt; str2 &lt;&lt; \"\\\") is \" &lt;&lt; myint2 &lt;&lt; '\\n';\r\n\r\n    \/\/ std::stoi(\"31337 with words\") is 31337\r\n    std::cout &lt;&lt; \"std::stoi(\\\"\" &lt;&lt; str3 &lt;&lt; \"\\\") is \" &lt;&lt; myint3 &lt;&lt; '\\n';\r\n}<\/pre>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2><span style=\"color: #0000ff;\"><strong>std::to\/from_chars<\/strong><\/span><\/h2>\n<p>Bir \u00f6nceki ba\u015fl\u0131k ile san\u0131r\u0131m kullanabilece\u011finiz API ufkunuz geni\u015flemi\u015f ve her bir API k\u00fcmesine ili\u015fkin bir fikriniz olmu\u015ftur. \u015eimdi art\u0131k yaz\u0131m\u0131z\u0131n konusu olan API&#8217;lere bakma zaman\u0131m\u0131z geldi.<\/p>\n<p>Hemen ilk sorumuza d\u00f6nelim. Bu kadar API varken neden bu API ler sunuldu? En \u00f6nemli sebebi, bu API&#8217;ler yukar\u0131daki API&#8217;lere g\u00f6re \u00e7ok daha az bir i\u015flemci y\u00fck\u00fc getirmekteler ve basittirler. Bu nas\u0131l oluyor peki?Dinamik bellek kullan\u0131mlar\u0131 yok, herhangi bir hata f\u0131rlatm\u0131yor (yine de hata d\u00f6nme mekanizmalar\u0131 mevcut), yerelle\u015ftirme ayarlar\u0131ndan etkilenmiyorlar. Bunlar\u0131n yan\u0131nda, bellek a\u015f\u0131mlar\u0131 kontrol alt\u0131nda ve en \u00f6nemlisi, bu iki API aras\u0131nda d\u00f6n\u00fc\u015f\u00fcmlerde ayn\u0131 de\u011fer garantisi sunulmakta (yani <em>to_chars<\/em> ile d\u00f6n\u00fc\u015ft\u00fcrd\u00fc\u011f\u00fcn\u00fcz noktal\u0131 say\u0131 <em>from_chars<\/em> ile geri d\u00f6nd\u00fcrd\u00fc\u011f\u00fcn\u00fczde ayn\u0131 olacak. Di\u011fer API&#8217;lerde arada kay\u0131plar olabiliyordu). San\u0131r\u0131m ne demek istedi\u011fimi anlatabildim \ud83d\ude42 Sonu\u00e7 olarak bu API&#8217;ler, daha alt seviye d\u00f6n\u00fc\u015f\u00fcm mekanizmas\u0131 ile yukar\u0131dakilerden daha iyi bir performans sunuyorlar.<\/p>\n<p>\u015eimdi bu iki API&#8217;ye yak\u0131ndan g\u00f6z atal\u0131m:<\/p>\n<p>Bu iki API&#8217;de &lt;charconv&gt; ba\u015fl\u0131k dosyas\u0131 arac\u0131l\u0131\u011f\u0131 ile sunulmakta. <em>to_char<\/em>(), say\u0131y\u0131 metine d\u00f6nd\u00fcrmek i\u00e7in, <em>from_chars<\/em>() metini say\u0131ya geri d\u00f6nd\u00fcrmek i\u00e7in kullan\u0131l\u0131r. Bu iki API de C+++ 17 ile birlikte sunulmaya ba\u015fland\u0131, bu sebeple kullanmadan \u00f6nce derleyicilerinizin bunu destekledi\u011finden emin olunuz<\/p>\n<p><span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/en.cppreference.com\/w\/cpp\/utility\/from_chars\">std::from_chars<\/a>:<\/strong><\/span><\/p>\n<ul>\n<li>Tam say\u0131lar i\u00e7in:\n<ul>\n<li>std<span class=\"sy4\">::<\/span><span class=\"me2\">from_chars_result<\/span>\u00a0from_chars<span class=\"br0\">(<\/span><span class=\"kw4\">const<\/span>\u00a0<span class=\"kw4\">char<\/span><span class=\"sy2\">*<\/span>\u00a0first,\u00a0<span class=\"kw4\">const<\/span>\u00a0<span class=\"kw4\">char<\/span><span class=\"sy2\">*<\/span>\u00a0last, TYPE\u00a0<span class=\"sy3\">&amp;<\/span>\u00a0value,\u00a0<span class=\"kw4\">int<\/span>\u00a0base\u00a0<span class=\"sy1\">=<\/span>\u00a0<span class=\"nu0\">10<\/span><span class=\"br0\">)<\/span><\/li>\n<\/ul>\n<\/li>\n<li>Noktal\u0131 say\u0131lar i\u00e7in:\n<ul>\n<li>std::from_chars_result from_chars(const char* first, const char* last, [float|double|long double]&amp; value,<br \/>\nstd::chars_format fmt = std::chars_format::general)<\/li>\n<\/ul>\n<\/li>\n<li>D\u00f6n\u00fc\u015f yap\u0131s\u0131:\n<ul>\n<li>\n<pre class=\"lang:c++ decode:true\">struct from_chars_result \r\n{\r\n    const char* ptr;\r\n    std::errc ec;\r\n};<\/pre>\n<\/li>\n<\/ul>\n<\/li>\n<li>[first-last) d\u00f6n\u00fc\u015ft\u00fcr\u00fclmek istenen metin aral\u0131\u011f\u0131,<\/li>\n<li>value, d\u00f6n\u00fc\u015ft\u00fcr\u00fclme ba\u015far\u0131l\u0131 olmas\u0131 durumunda, d\u00f6n\u00fc\u015ft\u00fcr\u00fclen say\u0131,<\/li>\n<li>base, tam say\u0131lar i\u00e7in say\u0131 sistemi,<\/li>\n<li>fmt, noktal\u0131 say\u0131lar i\u00e7in kullan\u0131lacak olan formatlama. Alabilece\u011fi de\u011ferler \u015fu \u015fekilde:\n<ul>\n<li>\n<pre class=\"lang:c++ decode:true \">enum class chars_format \r\n{\r\n     scientific,\r\n     fixed,\r\n     hex,\r\n     general = fixed | scientific\r\n};\r\n<\/pre>\n<\/li>\n<\/ul>\n<\/li>\n<li>Basit tam say\u0131 kullan\u0131m\u0131:\n<ul>\n<li>\n<pre class=\"lang:c++ decode:true\">#include &lt;charconv&gt; \r\n#include &lt;iostream&gt;\r\n#include &lt;string&gt;\r\n\r\nint main() \r\n{\r\n    const std::string str { \"12345678 ay\" };\r\n    \r\n    int value = 0;\r\n    const auto res = std::from_chars(str.data(), str.data() + str.size(), value);\r\n  \r\n    \/\/ value burada artik 12345678 i\u00e7eriyor\r\n    \/\/ res.ec de std::errc{}'ye e\u015fit. Bunlar\u0131n ne oldugunu asagida anlat\u0131cam\r\n    if (res.ec == std::errc()) \r\n    {\r\n      std::cout &lt;&lt; \"value: \" &lt;&lt; value &lt;&lt; \", distance: \" &lt;&lt; res.ptr - str.data() &lt;&lt; '\\n';\r\n    }\r\n    else if (res.ec == std::errc::invalid_argument) \r\n    {\r\n      std::cout &lt;&lt; \"invalid argument!\\n\";\r\n    }\r\n    else if (res.ec == std::errc::result_out_of_range) \r\n    {\r\n      std::cout &lt;&lt; \"out of range! res.ptr distance: \"\r\n      &lt;&lt; res.ptr - str.data() &lt;&lt; '\\n';\r\n    }\r\n\r\n    return 0;\r\n}\r\n#include &lt;charconv&gt;\r\n\r\n\r\n... \r\nconst char* str = \"12 ay\";\r\nint value;\r\n\r\nstd::from_chars_result res = std::from_chars(str, str+5, value);\r\n\r\n...<\/pre>\n<\/li>\n<\/ul>\n<\/li>\n<li>Ondal\u0131kl\u0131 say\u0131 kullan\u0131m\u0131na \u00f6rnek:\n<ul>\n<li>\n<pre class=\"lang:c++ decode:true \">const std::string str { \"16.78\" };\r\ndouble value = 0;\r\nconst auto format = std::chars_format::general;\r\nconst auto res = std::from_chars(str.data(), \r\n                                 str.data() + str.size(), \r\n                                 value, \r\n                                 format);<\/pre>\n<\/li>\n<\/ul>\n<\/li>\n<li>\u0130lgili API&#8217;nin d\u00f6nd\u00fc\u011f\u00fc <em>res<\/em> yap\u0131s\u0131 i\u00e7erisinde\u00a0<em>ptr<\/em> say\u0131 olarak kullan\u0131lmayan ilk karakteri, ya da aral\u0131\u011f\u0131n sonunu (<em>last\u00a0<\/em>arg\u00fcman\u0131n\u0131), <em>ec\u00a0<\/em>de i\u015flem sonucunu i\u00e7erir. Bu ba\u011flamda i\u015flemin ba\u015far\u0131l\u0131 olup\/olmad\u0131\u011f\u0131n\u0131 a\u015fa\u011f\u0131daki gibi kontrol edebilirsiniz. Burada bu de\u011fer bir bool tipi olarak kontrol edemezsiniz:\n<ul>\n<li>\n<pre class=\"lang:c++ decode:true\">if (res.ec != std::errc{}) \r\n{\r\n... \/\/ Hata olusmus\r\n}\r\n\r\n\/\/ Asagidaki gibi bir kullanim yok\r\n\/\/ if (res.ec) \r\n\/\/ { \r\n\/\/ }\r\n\r\n\/\/ Asagidaki gibi de bir kullanim yok\r\n\/\/ if (!res.ec) \r\n\/\/ { \r\n\/\/ }<\/pre>\n<\/li>\n<\/ul>\n<\/li>\n<li>\u00a0Burada d\u00f6n\u00fclen struct yap\u0131s\u0131ndan \u00f6t\u00fcr\u00fc yap\u0131sal ba\u011flamay\u0131 da kullanabiliriz. Hemen bir \u00f6rne\u011fe bakal\u0131m:\n<ul>\n<li>\n<pre class=\"lang:c++ decode:true \">if (auto [ptr, ec] = std::from_chars(str, str+5, value); ec != std::errc{}) \r\n{\r\n... \/\/ Hatal\u0131 bir durum oldu kontrol edelim\r\n}<\/pre>\n<\/li>\n<\/ul>\n<\/li>\n<li>Hatal\u0131 d\u00f6n\u00fc\u015f\u00fcm durumunda <strong><em>res.ptr<\/em><\/strong> ilk ge\u00e7irilen parametreyi i\u00e7erir, <strong><em>res.ec<\/em><\/strong> de\u00a0<em>std::errc::invalid_argument<\/em> olarak atan\u0131r. Ge\u00e7irilen <em>value\u00a0<\/em>de\u011fi\u015ftirilmez,<\/li>\n<li>S\u0131n\u0131r a\u015f\u0131m\u0131 durumunda ise <em><strong>res.ptr<\/strong><\/em> ilk say\u0131 olmayan\/formata uymayan karakter i\u015faret\u00e7isini i\u00e7erir ve <em><strong>res.ec<\/strong>\u00a0<\/em> de\u00a0<em>std::errc::result_out_of_range<\/em> i\u00e7erir,<\/li>\n<\/ul>\n<p><span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/en.cppreference.com\/w\/cpp\/utility\/to_chars\">std::to_chars<\/a>:<\/strong><\/span><\/p>\n<ul>\n<li>Tam say\u0131lar i\u00e7in:\n<ul>\n<li>std::to_chars_result to_chars(char* first, char* last,<br \/>\nTYPE value, int base = 10)<\/li>\n<\/ul>\n<\/li>\n<li>Noktal\u0131 say\u0131lar i\u00e7in:\n<ul>\n<li>std<span class=\"sy4\">::<\/span><span class=\"me2\">to_chars_result<\/span>\u00a0to_chars<span class=\"br0\">(<\/span><span class=\"kw4\">char<\/span><span class=\"sy2\">*<\/span>\u00a0first,\u00a0<span class=\"kw4\">char<\/span><span class=\"sy2\">*<\/span>\u00a0last, [<span class=\"kw4\">float|double|long double]<\/span>\u00a0value<span class=\"br0\">)<\/span><\/li>\n<li>std<span class=\"sy4\">::<\/span><span class=\"me2\">to_chars_result<\/span>\u00a0to_chars<span class=\"br0\">(<\/span><span class=\"kw4\">char<\/span><span class=\"sy2\">*<\/span>\u00a0first,\u00a0<span class=\"kw4\">char<\/span><span class=\"sy2\">*<\/span>\u00a0last,\u00a0 [<span class=\"kw4\">float|double|long double]<\/span>\u00a0 value,\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span class=\"kw2637\">std::<span class=\"me2\">chars_format<\/span><\/span>\u00a0fmt<span class=\"br0\">)<\/span><\/li>\n<li>std::to_chars_result to_chars(char* first, char* last,[<span class=\"kw4\">float|double|long double]<\/span>\u00a0value, std::chars_format fmt, int precision)<\/li>\n<\/ul>\n<\/li>\n<li>D\u00f6n\u00fc\u015f yap\u0131s\u0131:\n<ul>\n<li>\n<pre class=\"lang:c++ decode:true\">struct to_chars_result \r\n{\r\n    const char* ptr;\r\n    std::errc ec;\r\n};<\/pre>\n<\/li>\n<\/ul>\n<\/li>\n<li>[first-last) d\u00f6n\u00fc\u015ft\u00fcr\u00fclecek olan say\u0131n\u0131n saklanaca\u011f\u0131 metin aral\u0131\u011f\u0131,<\/li>\n<li>value, d\u00f6n\u00fc\u015ft\u00fcr\u00fclmek istenen say\u0131,<\/li>\n<li>base, tam say\u0131lar i\u00e7in say\u0131 sistemi,<\/li>\n<li>fmt, noktal\u0131 say\u0131lar i\u00e7in kullan\u0131lacak olan formatlama, yukar\u0131da vermi\u015ftim,<\/li>\n<li>precision, noktal\u0131 say\u0131lar i\u00e7in kullan\u0131lacak olan \u00e7\u00f6z\u00fcn\u00fcrl\u00fck<\/li>\n<li>\u00d6rnek tam say\u0131 kullan\u0131m\u0131:\n<ul>\n<li>\n<pre class=\"lang:c++ decode:true\">#include &lt;iostream&gt;\r\n#include &lt;charconv&gt;\r\n#include &lt;system_error&gt;\r\n#include &lt;string_view&gt;\r\n#include &lt;array&gt;\r\n \r\nint main()\r\n{\r\n    std::string str(10, ' ');\r\n  \r\n    if(auto [p, ec] = std::to_chars(str.data(), str.data() + str.size(), 1981); ec == std::errc())\r\n    {\r\n        std::cout &lt;&lt; str &lt;&lt; \", Size: \"&lt;&lt; res.ptr - str.data() &lt;&lt; \" characters\\n\"\r\n    }\r\n    else\r\n    {\r\n        std::cout &lt;&lt; \"Error!\\n\";\r\n    }\r\n}<\/pre>\n<\/li>\n<\/ul>\n<\/li>\n<li>\u00d6rnek noktal\u0131 say\u0131 kullan\u0131m\u0131:\n<ul>\n<li>\n<pre class=\"lang:c++ decode:true \">#include &lt;array&gt;\r\n#include &lt;charconv&gt;\r\n\r\ndouble pi = 3.14159265359;\r\nstd::array&lt;char, 128&gt; buffer;\r\nauto [ptr, ec] = std::to_chars(buffer.data(), buffer.data() + buffer.size(), pi,\r\n                               std::chars_format::fixed, 2);\r\nif (ec == std::errc{}) \r\n{\r\n    std::string s(buffer.data(), ptr);\r\n    \/\/ ....\r\n}\r\nelse \r\n{\r\n    \/\/ error handling\r\n}<\/pre>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Son olarak, \u00f6rnek kullan\u0131mlardan da g\u00f6rece\u011finiz \u00fczere ve bir C++ komitesindeki ki\u015finin dedi\u011fi gibi, bu API&#8217;ler asl\u0131nda direk kullanmaktan ziyade bunlar\u0131 altta kullanan daha anlaml\u0131 \u00fcst seviye servisler ile kullan\u0131lmas\u0131 gerekti\u011fi y\u00f6n\u00fcnde. Eee o zaman neden bunlarda standarda eklenmi\u015f diye sorabilirsiniz. O da, bunlar\u0131n mevcut C++&#8217;da, &#8220;null-terminated&#8221; C metin API&#8217;lerini kullanmadan zor olmas\u0131ndan \u00f6t\u00fcr\u00fc.<\/p>\n<h2><strong><span style=\"color: #0000ff;\">Performans<\/span><\/strong><\/h2>\n<p>Gelelim, bu API&#8217;lerin ortaya konulmas\u0131n\u0131n arkas\u0131ndaki en \u00f6nemli motivasyon olan performans olay\u0131na bakmaya. Bu konuda\u00a0Bartlomiej Filipek, olduk\u00e7a detayl\u0131 bir \u00f6l\u00e7\u00fcm yaparak sa\u011f olsun payla\u015fm\u0131\u015f ve bende burada, o sonu\u00e7lar\u0131 sizler ile payla\u015f\u0131yorum. Bu \u00f6l\u00e7\u00fcmler, mili saniye cinsinde, 1000 elemanl\u0131 vekt\u00f6r \u00fczerinde 1000 tekrar yaparak \u00f6l\u00e7\u00fclm\u00fc\u015f.<\/p>\n<p id=\"JDbqinb\"><img loading=\"lazy\" decoding=\"async\" width=\"535\" height=\"186\" class=\"alignnone size-full wp-image-1452 \" src=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/10\/img_5da1df2a7a325.png\" alt=\"\" srcset=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/10\/img_5da1df2a7a325.png 535w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/10\/img_5da1df2a7a325-300x104.png 300w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/10\/img_5da1df2a7a325-500x174.png 500w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/10\/img_5da1df2a7a325-150x52.png 150w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/10\/img_5da1df2a7a325-400x139.png 400w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/10\/img_5da1df2a7a325-200x70.png 200w\" sizes=\"auto, (max-width: 535px) 100vw, 535px\" \/><\/p>\n<p>\u00d6l\u00e7\u00fcm\u00fcn yap\u0131ld\u0131\u011f\u0131 makine, Windows 10 x64, i7 8700 3.2 GHz. Derleyici ayarlamalar\u0131:<\/p>\n<ul>\n<li>GCC 8.2 &#8211; compiled with-O2 -Wall -pedantic, MinGW Distro<\/li>\n<li>Clang 7.0 &#8211; compiled with-O2 -Wall -pedantic,Clang For Windows<\/li>\n<li>Visual Studio 2017 15.8 &#8211; Release mode, x64<\/li>\n<\/ul>\n<p>Bu de\u011ferlerin grafiksel g\u00f6sterimine ise a\u015fa\u011f\u0131dan ula\u015fabilirisiniz:<\/p>\n<p id=\"cDLGYVx\"><img loading=\"lazy\" decoding=\"async\" width=\"622\" height=\"628\" class=\"alignnone size-full wp-image-1453 \" src=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/10\/img_5da1dfcfe0961.png\" alt=\"\" srcset=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/10\/img_5da1dfcfe0961.png 622w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/10\/img_5da1dfcfe0961-150x151.png 150w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/10\/img_5da1dfcfe0961-297x300.png 297w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/10\/img_5da1dfcfe0961-500x505.png 500w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/10\/img_5da1dfcfe0961-400x404.png 400w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/10\/img_5da1dfcfe0961-200x202.png 200w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/10\/img_5da1dfcfe0961-57x57.png 57w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/10\/img_5da1dfcfe0961-72x72.png 72w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/10\/img_5da1dfcfe0961-114x114.png 114w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2019\/10\/img_5da1dfcfe0961-144x144.png 144w\" sizes=\"auto, (max-width: 622px) 100vw, 622px\" \/><\/p>\n<p>Sonu\u00e7lara bakacak olursak, \u00e7o\u011fu durumda yeni API&#8217;ler performans anlam\u0131nda bekleneni veriyor. Tabi bunun i\u00e7in yukar\u0131da bahsedilen \u00f6d\u00fcnleri de unutmamak laz\u0131m. Sonu\u00e7 olarak, temel metin\/say\u0131 d\u00f6n\u00fc\u015f\u00fcmleri i\u00e7in bu API&#8217;leri kullanabilirsiniz. Bu arada, \u00f6l\u00e7\u00fcm i\u00e7in kullan\u0131lan koda da, ilgili yazar\u0131n sayfas\u0131ndan ula\u015fabilirsiniz.<\/p>\n<p>Ben Yaz\u0131l\u0131mperver,\u00a0bir sonraki yaz\u0131mda g\u00f6r\u00fc\u015fmek dile\u011fiyle, kendinize iyi bak\u0131n.<\/p>\n<h2><strong><span style=\"color: #0000ff;\">Kaynaklar<\/span><\/strong><\/h2>\n<ul>\n<li><a href=\"http:\/\/en.cppreference.com\/w\/cpp\/utility\/to_chars\"><span style=\"color: #008000;\"><strong>http:\/\/en.cppreference.com\/w\/cpp\/utility\/to_chars<\/strong><\/span><\/a><\/li>\n<li><a href=\"http:\/\/en.cppreference.com\/w\/cpp\/utility\/from_chars\"><span style=\"color: #008000;\"><strong>http:\/\/en.cppreference.com\/w\/cpp\/utility\/from_chars<\/strong><\/span><\/a><\/li>\n<li><a href=\"https:\/\/www.fluentcpp.com\/2018\/07\/27\/how-to-efficiently-convert-a-string-to-an-int-in-c\/\"><span style=\"color: #008000;\"><strong>https:\/\/www.fluentcpp.com\/2018\/07\/27\/how-to-efficiently-convert-a-string-to-an-int-in-c\/<\/strong><\/span><\/a><\/li>\n<li><span style=\"color: #008000;\"><strong><a href=\"https:\/\/www.fluentcpp.com\/2018\/07\/24\/how-to-convert-a-string-to-an-int-in-c\/\">https:\/\/www.fluentcpp.com\/2018\/07\/24\/how-to-convert-a-string-to-an-int-in-c\/<\/a><\/strong><\/span><\/li>\n<li><a href=\"https:\/\/stackoverflow.com\/questions\/55875862\/c17-purpose-of-stdfrom-chars-and-stdto-chars\"><span style=\"color: #008000;\"><strong>https:\/\/stackoverflow.com\/questions\/55875862\/c17-purpose-of-stdfrom-chars-and-stdto-chars<\/strong><\/span><\/a><\/li>\n<li><a href=\"https:\/\/www.bfilipek.com\/2018\/12\/fromchars.html\"><span style=\"color: #008000;\"><strong>https:\/\/www.bfilipek.com\/2018\/12\/fromchars.html<\/strong><\/span><\/a><\/li>\n<li><a href=\"https:\/\/www.youtube.com\/watch?v=4P_kbF0EbZM\"><span style=\"color: #008000;\"><strong>https:\/\/www.youtube.com\/watch?v=4P_kbF0EbZM<\/strong><\/span><\/a><\/li>\n<li><span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/javierestrada.blog\/2019\/06\/15\/a-conversion-story-improving-from_chars-and-to_chars-in-c17\/\">https:\/\/dzone.com\/articles\/how-to-use-the-newest-c-string-conversion-routines<\/a><\/strong><\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>","protected":false},"excerpt":{"rendered":"<p>B\u00c7OM, SOLID, SSL derken haftal\u0131k C++ yaz\u0131lar\u0131n\u0131 unuttu\u011fumu sand\u0131ysan\u0131z b\u00fcy\u00fck yan\u0131lg\u0131 i\u00e7erisindesin \ud83d\ude42 Tabi, en son yazd\u0131\u011f\u0131m yaz\u0131n\u0131n \u00fczerinden bir ka\u00e7 ay ge\u00e7mi\u015f olabilir ama bu seri devam edecek o kadar \ud83d\ude42 Bu k\u0131sa yaz\u0131m\u0131zda, C++ 17 ile birlikte gelen std::from_chars ve std::to_chars API&#8217;lerine bir g\u00f6z ataca\u011f\u0131z. Bu API&#8217;ler bize ne kazand\u0131r\u0131yor, daha \u00f6nce bu&#8230; <a class=\"more-link\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2019\/10\/18\/haftalik-c-19-stdfrom_chars-to_chars\/\">Continue reading <span class=\"meta-nav\">&#8594;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":174,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[10,41,11],"tags":[582,46,234,574,571,570,575,584,576,583,577,579,580,578,581,573,572,236],"class_list":["post-1448","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c","category-modern-c","category-visual-studio","tag-atol-atoi-atoll","tag-c-11","tag-c-17","tag-from_chars","tag-internationalization","tag-locale","tag-setlocale","tag-snprintf","tag-sprintf","tag-sscanf","tag-stdstoi","tag-stdstringstream","tag-stdstrstream","tag-stdto_string","tag-strtol","tag-to_chars","tag-turkish","tag-weekly-c"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Haftal\u0131k C++ 19 \u2013 std::from_chars\/to_chars - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2019\/10\/18\/haftalik-c-19-stdfrom_chars-to_chars\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"[:tr]Haftal\u0131k C++ 19 \u2013 std::from_chars\/to_chars[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"og:description\" content=\"B\u00c7OM, SOLID, SSL derken haftal\u0131k C++ yaz\u0131lar\u0131n\u0131 unuttu\u011fumu sand\u0131ysan\u0131z b\u00fcy\u00fck yan\u0131lg\u0131 i\u00e7erisindesin \ud83d\ude42 Tabi, en son yazd\u0131\u011f\u0131m yaz\u0131n\u0131n \u00fczerinden bir ka\u00e7 ay ge\u00e7mi\u015f olabilir ama bu seri devam edecek o kadar \ud83d\ude42 Bu k\u0131sa yaz\u0131m\u0131zda, C++ 17 ile birlikte gelen std::from_chars ve std::to_chars API&#8217;lerine bir g\u00f6z ataca\u011f\u0131z. Bu API&#8217;ler bize ne kazand\u0131r\u0131yor, daha \u00f6nce bu... Continue reading &#8594;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.yazilimperver.com\/index.php\/2019\/10\/18\/haftalik-c-19-stdfrom_chars-to_chars\/\" \/>\n<meta property=\"og:site_name\" content=\"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2019-10-18T14:13:28+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2017\/12\/FeaturedImage-e1580417052514.png\" \/>\n\t<meta property=\"og:image:width\" content=\"32\" \/>\n\t<meta property=\"og:image:height\" content=\"32\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"yaz\u0131l\u0131mperver\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"yaz\u0131l\u0131mperver\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"18 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/10\/18\/haftalik-c-19-stdfrom_chars-to_chars\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/10\/18\/haftalik-c-19-stdfrom_chars-to_chars\/\"},\"author\":{\"name\":\"yaz\u0131l\u0131mperver\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"headline\":\"Haftal\u0131k C++ 19 \u2013 std::from_chars\/to_chars\",\"datePublished\":\"2019-10-18T14:13:28+00:00\",\"dateModified\":\"2019-10-18T14:13:28+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/10\/18\/haftalik-c-19-stdfrom_chars-to_chars\/\"},\"wordCount\":2049,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"keywords\":[\"atol\/atoi\/atoll\",\"C++ 11\",\"c++ 17\",\"from_chars\",\"internationalization\",\"locale\",\"setlocale\",\"snprintf\",\"sprintf\",\"sscanf\",\"std::stoi\",\"std::stringstream\",\"std::strstream\",\"std::to_string\",\"strtol\",\"to_chars\",\"turkish\",\"weekly c++\"],\"articleSection\":[\"C++\",\"Modern C++\",\"Visual Studio\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2019\/10\/18\/haftalik-c-19-stdfrom_chars-to_chars\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/10\/18\/haftalik-c-19-stdfrom_chars-to_chars\/\",\"url\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/10\/18\/haftalik-c-19-stdfrom_chars-to_chars\/\",\"name\":\"[:tr]Haftal\u0131k C++ 19 \u2013 std::from_chars\/to_chars[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#website\"},\"datePublished\":\"2019-10-18T14:13:28+00:00\",\"dateModified\":\"2019-10-18T14:13:28+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/10\/18\/haftalik-c-19-stdfrom_chars-to_chars\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2019\/10\/18\/haftalik-c-19-stdfrom_chars-to_chars\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2019\/10\/18\/haftalik-c-19-stdfrom_chars-to_chars\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Ana sayfa\",\"item\":\"https:\/\/www.yazilimperver.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Haftal\u0131k C++ 19 \u2013 std::from_chars\/to_chars\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.yazilimperver.com\/#website\",\"url\":\"https:\/\/www.yazilimperver.com\/\",\"name\":\"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\",\"description\":\"Payla\u015fmak g\u00fczeldir.\",\"publisher\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.yazilimperver.com\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\",\"name\":\"yaz\u0131l\u0131mperver\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png\",\"contentUrl\":\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png\",\"caption\":\"yaz\u0131l\u0131mperver\"},\"logo\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"[:tr]Haftal\u0131k C++ 19 \u2013 std::from_chars\/to_chars[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.yazilimperver.com\/index.php\/2019\/10\/18\/haftalik-c-19-stdfrom_chars-to_chars\/","og_locale":"tr_TR","og_type":"article","og_title":"[:tr]Haftal\u0131k C++ 19 \u2013 std::from_chars\/to_chars[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","og_description":"B\u00c7OM, SOLID, SSL derken haftal\u0131k C++ yaz\u0131lar\u0131n\u0131 unuttu\u011fumu sand\u0131ysan\u0131z b\u00fcy\u00fck yan\u0131lg\u0131 i\u00e7erisindesin \ud83d\ude42 Tabi, en son yazd\u0131\u011f\u0131m yaz\u0131n\u0131n \u00fczerinden bir ka\u00e7 ay ge\u00e7mi\u015f olabilir ama bu seri devam edecek o kadar \ud83d\ude42 Bu k\u0131sa yaz\u0131m\u0131zda, C++ 17 ile birlikte gelen std::from_chars ve std::to_chars API&#8217;lerine bir g\u00f6z ataca\u011f\u0131z. Bu API&#8217;ler bize ne kazand\u0131r\u0131yor, daha \u00f6nce bu... Continue reading &#8594;","og_url":"https:\/\/www.yazilimperver.com\/index.php\/2019\/10\/18\/haftalik-c-19-stdfrom_chars-to_chars\/","og_site_name":"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","article_published_time":"2019-10-18T14:13:28+00:00","og_image":[{"width":32,"height":32,"url":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2017\/12\/FeaturedImage-e1580417052514.png","type":"image\/png"}],"author":"yaz\u0131l\u0131mperver","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"yaz\u0131l\u0131mperver","Tahmini okuma s\u00fcresi":"18 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.yazilimperver.com\/index.php\/2019\/10\/18\/haftalik-c-19-stdfrom_chars-to_chars\/#article","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2019\/10\/18\/haftalik-c-19-stdfrom_chars-to_chars\/"},"author":{"name":"yaz\u0131l\u0131mperver","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"headline":"Haftal\u0131k C++ 19 \u2013 std::from_chars\/to_chars","datePublished":"2019-10-18T14:13:28+00:00","dateModified":"2019-10-18T14:13:28+00:00","mainEntityOfPage":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2019\/10\/18\/haftalik-c-19-stdfrom_chars-to_chars\/"},"wordCount":2049,"commentCount":0,"publisher":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"keywords":["atol\/atoi\/atoll","C++ 11","c++ 17","from_chars","internationalization","locale","setlocale","snprintf","sprintf","sscanf","std::stoi","std::stringstream","std::strstream","std::to_string","strtol","to_chars","turkish","weekly c++"],"articleSection":["C++","Modern C++","Visual Studio"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.yazilimperver.com\/index.php\/2019\/10\/18\/haftalik-c-19-stdfrom_chars-to_chars\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.yazilimperver.com\/index.php\/2019\/10\/18\/haftalik-c-19-stdfrom_chars-to_chars\/","url":"https:\/\/www.yazilimperver.com\/index.php\/2019\/10\/18\/haftalik-c-19-stdfrom_chars-to_chars\/","name":"[:tr]Haftal\u0131k C++ 19 \u2013 std::from_chars\/to_chars[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/#website"},"datePublished":"2019-10-18T14:13:28+00:00","dateModified":"2019-10-18T14:13:28+00:00","breadcrumb":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2019\/10\/18\/haftalik-c-19-stdfrom_chars-to_chars\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.yazilimperver.com\/index.php\/2019\/10\/18\/haftalik-c-19-stdfrom_chars-to_chars\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.yazilimperver.com\/index.php\/2019\/10\/18\/haftalik-c-19-stdfrom_chars-to_chars\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Ana sayfa","item":"https:\/\/www.yazilimperver.com\/"},{"@type":"ListItem","position":2,"name":"Haftal\u0131k C++ 19 \u2013 std::from_chars\/to_chars"}]},{"@type":"WebSite","@id":"https:\/\/www.yazilimperver.com\/#website","url":"https:\/\/www.yazilimperver.com\/","name":"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","description":"Payla\u015fmak g\u00fczeldir.","publisher":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.yazilimperver.com\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb","name":"yaz\u0131l\u0131mperver","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/","url":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png","contentUrl":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png","caption":"yaz\u0131l\u0131mperver"},"logo":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/1448","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/comments?post=1448"}],"version-history":[{"count":14,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/1448\/revisions"}],"predecessor-version":[{"id":1465,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/1448\/revisions\/1465"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/media\/174"}],"wp:attachment":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/media?parent=1448"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/categories?post=1448"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/tags?post=1448"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}