{"id":6495,"date":"2021-11-25T10:23:44","date_gmt":"2021-11-25T08:23:44","guid":{"rendered":"https:\/\/blue.pri.ee\/ttu\/?p=6495"},"modified":"2026-10-10T18:39:30","modified_gmt":"2026-10-10T16:39:30","slug":"pr1et13-soned","status":"publish","type":"post","link":"https:\/\/blue.pri.ee\/ttu\/laborid\/pr1-et\/pr1et13-soned\/","title":{"rendered":"PR1ET13: S\u00f5ned"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_89 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr1-et\/pr1et13-soned\/#Praktikumi_materjal\" >Praktikumi materjal<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr1-et\/pr1et13-soned\/#Esitamisele_kuuluvad_ulesanded\" >Esitamisele kuuluvad \u00fclesanded<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr1-et\/pr1et13-soned\/#Ulesanne_1_W13-1_Tutvume_stringh_teegiga\" >\u00dclesanne 1 [W13-1]: Tutvume string.h teegiga<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr1-et\/pr1et13-soned\/#Nouded\" >N\u00f5uded<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr1-et\/pr1et13-soned\/#Abifunktsioon\" >Abifunktsioon<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr1-et\/pr1et13-soned\/#Juhend\" >Juhend<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr1-et\/pr1et13-soned\/#Programmi_lopptulemus\" >Programmi l\u00f5pptulemus<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr1-et\/pr1et13-soned\/#Ulesanne_2_W13-2_CSV-st_meiliaadresside_genereerimine\" >\u00dclesanne 2 [W13-2]: CSV-st meiliaadresside genereerimine<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr1-et\/pr1et13-soned\/#CSV_formaat\" >CSV formaat<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr1-et\/pr1et13-soned\/#Nouded-2\" >N\u00f5uded<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr1-et\/pr1et13-soned\/#Naide\" >N\u00e4ide<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr1-et\/pr1et13-soned\/#Vihjed\" >Vihjed<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr1-et\/pr1et13-soned\/#Lisaulesanne_1_W13-3_Tahtede_loendus\" >Lisa\u00fclesanne 1 [W13-3]: T\u00e4htede loendus<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr1-et\/pr1et13-soned\/#Lisaulesanne_2_W13-4_CSV_laiendus\" >Lisa\u00fclesanne 2 [W13-4]: CSV laiendus<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr1-et\/pr1et13-soned\/#Parast_tundi_peaksid\" >P\u00e4rast tundi peaksid<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr1-et\/pr1et13-soned\/#Taiendav_materjal\" >T\u00e4iendav materjal<\/a><\/li><\/ul><\/nav><\/div>\n<h3><span class=\"ez-toc-section\" id=\"Praktikumi_materjal\"><\/span><strong>Praktikumi materjal<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li>Slaidid: <a href=\"https:\/\/blue.pri.ee\/ttu\/files\/iax0583\/slaidid-et\/13_Soned.pdf\"><strong>S\u00f5ned<\/strong><\/a><\/li>\n<li>N\u00e4ide:\u00a0<strong><a href=\"https:\/\/blue.pri.ee\/ttu\/programmeerimine-i\/koodinaited\/characters-c\/\" data-select-like-a-boss=\"1\">m\u00f5ningad lihtsamad t\u00e4hem\u00e4rkide omistamised<\/a><\/strong><\/li>\n<\/ul>\n<h3><span class=\"ez-toc-section\" id=\"Esitamisele_kuuluvad_ulesanded\"><\/span>Esitamisele kuuluvad \u00fclesanded<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Selles tunnis on kaks \u00fclesannet, millest esimeses \u00f5pime tundma string.h teeki ning teises manipuleerime t\u00e4hem\u00e4rke k\u00e4sitsi.<\/p>\n<h4><span class=\"ez-toc-section\" id=\"Ulesanne_1_W13-1_Tutvume_stringh_teegiga\"><\/span>\u00dclesanne 1 [W13-1]: Tutvume string.h teegiga<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Selle \u00fclesande k\u00e4igus lood samm-sammu haaval programmi, mille k\u00e4igus tutvud peamiselt erinevate string.h teegis olevate standardfunktsioonidega.<\/p>\n<h5><span class=\"ez-toc-section\" id=\"Nouded\"><\/span>N\u00f5uded<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<ul>\n<li><strong>Programmi koostamiseks liigu samm-sammult juhendis antud j\u00e4rjekorras.<\/strong><\/li>\n<li>Programmi k\u00e4ivitades k\u00fcsitakse kasutajalt parooli. Enne \u00f5ige parooli sisestamist ei tohi programm edasi minna.<\/li>\n<li>Kasutajalt loetakse lause. Programm kuvab, mitu t\u00e4hem\u00e4rki lauses oli (sh t\u00fchikud, kirjavahem\u00e4rgid).<\/li>\n<li>Kasutajalt loetakse otsingufraas. Seej\u00e4rel v\u00e4ljastatakse, kas eelnevalt sisestatud lauses see fraas esines v\u00f5i mite (jah\/ei vastus).<\/li>\n<li>Kasutajalt k\u00fcsitakse kaks s\u00f5na, mida kasutatakse lause moodustamisel.\n<ul>\n<li>S\u00f5nade t\u00fc\u00fcbid v\u00f5id ise valida (nt nimi, ese, omaduss\u00f5na, tegus\u00f5na, &#8230;)<\/li>\n<li>Kleebi kasutaja poolt sisestatud s\u00f5nad kokku, lisades enda poolt t\u00e4iendavaid s\u00f5nu, moodustamaks v\u00e4hemalt neljast s\u00f5nast koosneva lihtlause.<\/li>\n<li>\u00dcks kasutaja sisestatud s\u00f5nadest peab olema selle lauses esimene s\u00f5na.<\/li>\n<li>Moodustatav lause tuleb salvestada t\u00e4iesti uude t\u00e4hem\u00e4rgimassiivi, mis peab\u00a0mahutama selle lause ka siis, kui loetud 2 s\u00f5na olid maksimaalse lubatud pikkusega.<\/li>\n<\/ul>\n<\/li>\n<li>Kogu \u00fclesande v\u00e4ltel tohid sisestuse lugemiseks ja t\u00f6\u00f6tlemiseks kasutada vaid ohutuid funktsioone! St funktsioone, mis piiritlevad mitu t\u00e4hem\u00e4rki tohib maksimaalselt lugeda.<\/li>\n<\/ul>\n<h5><span class=\"ez-toc-section\" id=\"Abifunktsioon\"><\/span>Abifunktsioon<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Selleks, et paremini aru saada mis t\u00e4hem\u00e4rgid parasjagu tekstimassiivi sees paiknevad, pakun v\u00e4lja abifunktsiooni.\u00a0Funktsioon tr\u00fckib v\u00e4lja tervikliku s\u00f5ne, misj\u00e4rel tr\u00fckitakse k\u00f5ik t\u00e4hem\u00e4rgid ja selle vastavad ASCII tabeli t\u00e4isarvulised v\u00e4\u00e4rtused. Nii on lihtsam tuvastada, kui n\u00e4iteks m\u00f5ni reavahetus v\u00f5i muu ootamatu s\u00fcmbol j\u00e4\u00e4b massiivi sisse.<\/p>\n<pre class=\"toolbar:1 lang:default decode:true\">void DebugString(char str[])\r\n{\r\n    printf(\"String is: '%s'\\n\", str);\r\n\r\n    int i = 0;\r\n    while (str[i] != '\\0')\r\n    {\r\n        printf(\"str[%d] = %3hhu %c\\n\", i, str[i], str[i]);\r\n        i++;\r\n    }\r\n    printf(\"\\n\");\r\n}<\/pre>\n<h5><span class=\"ez-toc-section\" id=\"Juhend\"><\/span>Juhend<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<h6>1. samm: kasutaja sisestuse lugemine<\/h6>\n<p>Esimese sammu teeme tunnis koos l\u00e4bi! Selle k\u00e4igus loome kaks vajalikku funktsiooni.<\/p>\n<p>Alustame esimesest, mida kasutame s\u00f5ne lugemiseks. Lahenduses on oluline, et suudaksime lugeda mitmest s\u00f5nadest koosnevaid s\u00f5nesid &#8211; st t\u00fchik ei tohi lugemist \u00e4ra l\u00f5petada. Selleks on mitmeid viise, kuid meie l\u00e4heneme \u00fclesandele kasutades funktsiooni <span class=\"lang:default highlight:0 decode:true crayon-inline \">fgets()<\/span> . Soovi korral v\u00f5id ise teist teed minna.<\/p>\n<p>Funktsiooni <span class=\"lang:default highlight:0 decode:true crayon-inline\">fgets()<\/span>\u00a0 erip\u00e4radeks on, et ta on m\u00f5eldud lugemaks failist. K\u00fcll aga k\u00f5ik asjad on failid, sh ka klaviatuurilt tulev andmevoog, seega saame kasutada failina <span class=\"lang:default highlight:0 decode:true crayon-inline\">stdin<\/span>\u00a0 nimelist faili. Teine keerukus antud funktsiooni juures on piirang mitu t\u00e4hem\u00e4rki lugeda tohib &#8211; see on ohutuse tagamiseks, et puhvri pikkusest \u00fcle ei mindaks. Kolmandaks keerukuse koht on reavahetus, mis tekib klaviatuurilt enter klahvi vajutamisel &#8211; ka s\u00fcmbol <span class=\"lang:default highlight:0 decode:true crayon-inline\">\\n<\/span>\u00a0 salvestatakse\u00a0 massiivi.<\/p>\n<p>L\u00e4henemises kasutame p\u00f5him\u00f5tet, et loome funktsioonidele <em>wrapperid<\/em> ehk \u00fcmbritseme need t\u00e4iendavate lausetega, mis muudavad funktsiooni kasutamise mugavamaks ja turvalisemaks.<\/p>\n<p>Loodaval \u00fcmbrisel on vaja kahte sisendit &#8211; s\u00f5net ehk t\u00e4hem\u00e4rgimassiivi, kuhu sisend salvestatakse ning selle pikkust, et v\u00e4ltida puhvri \u00fclet\u00e4itumise r\u00fcnnakuid.<\/p>\n<p>Lahenduses oleme j\u00e4tnud kolme kohta k\u00fcsim\u00e4rgid sisse. Sinu esimeseks \u00fclesandeks on t\u00e4ita l\u00fcngad. Vihjeks: kui loetud s\u00f5ne pikkus on 10 t\u00e4hem\u00e4rki, siis indeksiga 8 paikneb viimane oluline t\u00e4hem\u00e4rk, mille kasutaja sisestas. Sellele j\u00e4rgneb reavahetuse t\u00e4hem\u00e4rk, millest tuleb lahti saada, asendades selle s\u00f5ne l\u00f5pu s\u00fcmboliga. Vajadusel kasuta varasemalt v\u00e4lja toodud abifunktsiooni sisendi anal\u00fc\u00fcsimiseks.<\/p>\n<p><span class=\"lang:c highlight:0 decode:true crayon-inline \">size_t<\/span>\u00a0 on andmet\u00fc\u00fcp, mida kasutatakse pikkuste hoiustamiseks, massiivide indekseerimiseks ja loendamiseks. Tegelikkuses on see lihtsalt m\u00e4rgita t\u00e4isarv.<\/p>\n<pre class=\"toolbar:2 lang:default decode:true\">void GetString(char str[], int max)\r\n{\r\n    \/\/ Read the string from keyboard\r\n    fgets(str, max, stdin);\r\n\r\n    \/\/ TODO: Find the length of the actual string we just read\r\n    \/\/ size_t len = ???;\r\n    \r\n    \/\/ TODO: Write the string terminator in place of the newline to fix the string\r\n    \/\/ str[ ??? ] = ???;\r\n}<\/pre>\n<p>Kui lugemisfunktsioon on valmis, loome j\u00e4rgmise \u00fcmbrise oma vastloodud <span class=\"lang:default highlight:0 decode:true crayon-inline\">GetString()<\/span>\u00a0 funktsioonile. Nii saame lisada ka sisestuse p\u00e4ringu.<\/p>\n<pre class=\"toolbar:2 lang:default decode:true\">void PromptString(char str[], int max, char prompt[])\r\n{\r\n    printf(\"%s: \", prompt);\r\n    GetString(str, max);\r\n}<\/pre>\n<p>Pane t\u00e4hele, et m\u00f5lemaid funktsioone on v\u00f5imalik kasutada &#8211; <span class=\"lang:c highlight:0 decode:true crayon-inline \">GetString()<\/span>\u00a0 kasuta siis kui p\u00e4ringuteksti pole vaja ning <span class=\"lang:c highlight:0 decode:true crayon-inline \">PromptString ()<\/span>\u00a0 ku soovid esmalt p\u00e4ringu esitada.<\/p>\n<p>Oletame, et meil on olemas t\u00e4hem\u00e4rgimassiiv <span class=\"lang:default highlight:0 decode:true crayon-inline\">sentence[]<\/span> , mille pikkus on defineeritud makroga <span class=\"lang:default highlight:0 decode:true crayon-inline\">MAX_STR<\/span> . Sellisel juhul v\u00f5ib v\u00e4ljakutset luua kahte moodi, olenevalt kas <span class=\"lang:c highlight:0 decode:true crayon-inline \">sentence<\/span>\u00a0 on deklareeritud samas funktsioonis v\u00f5i mitte.<\/p>\n<pre class=\"toolbar:2 lang:default decode:true\">\/\/ Generic version (sentence declared somewhere else or it's not a local array)\r\nPromptString(sentence, STR_MAX, \"Please enter a sentence\");\r\n\r\n\/\/ If sentence is declared in the same function as this function call\r\nPromptString(sentence, sizeof(sentence), \"Please enter a sentence\");<\/pre>\n<h6>2. samm: lause lugemine ja selle pikkus<\/h6>\n<p>Loe kasutajalt lause. Seej\u00e4rel leia ja v\u00e4ljasta sisestatud lause pikkus kasutades standardfunktsiooni <span class=\"lang:c highlight:0 decode:true crayon-inline\">string.h<\/span>\u00a0 teegist.<\/p>\n<div class=\"su-spoiler su-spoiler-style-fancy su-spoiler-icon-chevron su-spoiler-closed\" data-scroll-offset=\"0\" data-anchor-in-url=\"no\"><div class=\"su-spoiler-title\" tabindex=\"0\" role=\"button\"><span class=\"su-spoiler-icon\"><\/span>Lahenduseks vajalikud teadmised<\/div><div class=\"su-spoiler-content su-u-clearfix su-u-trim\">\n<p>Lahenduseks kasuta funktsiooni <span class=\"lang:c highlight:0 decode:true crayon-inline\">strlen()<\/span> , tagastab mitu t\u00e4hem\u00e4rki funktsiooni parameetrina edastatud s\u00f5nes paikneb. Dokumentatsioon: <strong><a style=\"cursor: pointer !important; user-select: none !important;\" href=\"https:\/\/en.cppreference.com\/c\/string\/byte\/strlen\">https:\/\/en.cppreference.com\/c\/string\/byte\/strlen<\/a><\/strong><\/p>\n<pre class=\"toolbar:2 lang:c decode:true\">size_t strlen( const char* str );<\/pre>\n<p>Parameetriks s\u00f5ne, mille pikkust soovid leida (<span class=\"lang:c highlight:0 decode:true crayon-inline \">const char* str<\/span> ). Tagastab t\u00e4hem\u00e4rkide arvu m\u00e4rgita t\u00e4isarvuna (<span class=\"lang:c highlight:0 decode:true crayon-inline \">size_t<\/span>\u00a0).<\/p>\n<p>N\u00e4iteks j\u00e4rgnev koodil\u00f5ik v\u00e4ljastab numbri 8 kuna &#8220;Hello!!!&#8221; sisaldab 8 t\u00e4hem\u00e4rki<\/p>\n<pre class=\"toolbar:2 lang:c decode:true\">size_t len = strlen(\"Hello!!!\");\r\nprintf(\"%zu\", len);<\/pre>\n<\/div><\/div>\n<pre class=\"theme:cisco-router toolbar:2 nums:false lang:c highlight:0 decode:true\">Enter a sentence: I do wish we could chat longer, but I'm having an old friend for dinner.\r\nThe length of the entered sentence is 72<\/pre>\n<h6>3. samm: fraasi otsimine<\/h6>\n<p>Lisa programmi funktsioon, milles k\u00fcsitakse kasutajalt otsingufraas. Programm v\u00e4ljastab, kas otsitav fraas eksisteeris varasemalt sisestatud lauses v\u00f5i mitte. Lahenduseks piisab jah\/ei vastuseks,<\/p>\n<div class=\"su-spoiler su-spoiler-style-fancy su-spoiler-icon-chevron su-spoiler-closed\" data-scroll-offset=\"0\" data-anchor-in-url=\"no\"><div class=\"su-spoiler-title\" tabindex=\"0\" role=\"button\"><span class=\"su-spoiler-icon\"><\/span>Lahenduseks vajalikud teadmised<\/div><div class=\"su-spoiler-content su-u-clearfix su-u-trim\">\n<p>Lahenduseks kasuta funktsiooni <span class=\"lang:c highlight:0 decode:true crayon-inline \">strstr()<\/span> , mis otsib s\u00f5ne seest alamosa, piltlikult \u00f6eldes n\u00f5ela heinakuhjast. Dokumentatsioon: <strong><a href=\"https:\/\/en.cppreference.com\/c\/string\/byte\/strstr\">https:\/\/en.cppreference.com\/c\/string\/byte\/strstr<\/a><\/strong><\/p>\n<pre class=\"toolbar:2 lang:c decode:true\">char* strstr( const char* str, const char* substr );<\/pre>\n<p>Parameetriteks on n\u00f5el (<span class=\"lang:c highlight:0 decode:true crayon-inline \">const char* str<\/span>\u00a0) ja heinakuhi (<span class=\"lang:c highlight:0 decode:true crayon-inline \">const char* substr<\/span>\u00a0). Tagastatakse asukoht ehk m\u00e4luaadress (<span class=\"lang:c highlight:0 decode:true crayon-inline \">char*<\/span>\u00a0) kust n\u00f5el leiti.<\/p>\n<p>J\u00e4rgnevas koodip\u00f5hjas on kasutusel\u00a0 makro <span class=\"lang:c highlight:0 decode:true crayon-inline\">NULL<\/span> , mis t\u00e4histab objekti v\u00f5i m\u00e4luaadressi, mida ei eksisteeri (kutsume null-viidaks, pikemalt tulevikus). See on vajalik kuna funktsioon <span class=\"lang:c highlight:0 decode:true crayon-inline \">strstr()<\/span>\u00a0 ei tagasta mitte jah\/ei vastust, vaid \u00fctleb asukoha (m\u00e4luaadressi), kus kohas leitud s\u00f5ne paikneb. Kui otsitavat s\u00f5ne ei leita, tagastatakse <span class=\"lang:c highlight:0 decode:true crayon-inline \">NULL<\/span>\u00a0.<\/p>\n<pre class=\"toolbar:2 lang:default decode:true\">if (strstr() != NULL)\r\n{\r\n   \r\n}\r\nelse\r\n{\r\n    \r\n}<\/pre>\n<\/div><\/div>\n<pre class=\"theme:cisco-router toolbar:2 nums:false lang:c highlight:0 decode:true\">Enter a sentence: I do wish we could chat longer, but I'm having an old friend for dinner.\r\nThe length of the entered sentence is 72\r\n \r\nPlease enter a search phrase: old friend\r\nYour search phrase \"old friend\" exists in the originally entered sentence<\/pre>\n<h6>4. samm: parooli k\u00fcsimine<\/h6>\n<p>Lisa programmi funktsioon, mis k\u00fcsib kasutajalt parooli ning ei luba kasutajat programmiga j\u00e4tkata enne, kui korrektne parool on sisestatud. Parooli kontroll peab olema t\u00f5stutundlik (st suured ja v\u00e4iket\u00e4hed on erinevad).<\/p>\n<p>Soovi korral v\u00f5id lisada parooli sisestamise katsete arvu ning katsete t\u00e4itumisel programmi sulgeda. Samuti v\u00f5id lisada n\u00e4iteks parooli vihje, mida kuvatakse vale parooli sisestamisel.<\/p>\n<p>NB! T\u00e4nases tunnis on l\u00e4htekoodi sisse kirjutatud kr\u00fcpteerimata parool OK, p\u00e4riss\u00fcsteemis \u00e4ra kunagi nii tee.<\/p>\n<div class=\"su-spoiler su-spoiler-style-fancy su-spoiler-icon-chevron su-spoiler-closed\" data-scroll-offset=\"0\" data-anchor-in-url=\"no\"><div class=\"su-spoiler-title\" tabindex=\"0\" role=\"button\"><span class=\"su-spoiler-icon\"><\/span>Lahenduseks vajalikud teadmised<\/div><div class=\"su-spoiler-content su-u-clearfix su-u-trim\">\n<p>Lahenduseks kasuta funktsiooni <span class=\"lang:c highlight:0 decode:true crayon-inline\">strcmp()<\/span>\u00a0 , mis v\u00f5rdleb s\u00f5nesid t\u00e4hem\u00e4rkhaaval. Sel korral loe parameetrite ja tagastuse kohta dokumentatsioonist: <strong><a href=\"https:\/\/en.cppreference.com\/c\/string\/byte\/strcmp\">https:\/\/en.cppreference.com\/c\/string\/byte\/strcmp<\/a><\/strong><\/p>\n<pre class=\"toolbar:2 lang:c decode:true\">int strcmp( const char* lhs, const char* rhs );<\/pre>\n<\/div><\/div>\n<pre class=\"theme:cisco-router toolbar:2 nums:false lang:c highlight:0 decode:true\">Please enter a password: password\r\nInvalid password! Try again!\r\n \r\nPlease enter a password: again\r\nInvalid password! Try again!\r\n \r\nPlease enter a password: hunter2\r\nPassword accepted. Welcome AzureDiamond!\r\n \r\nEnter a sentence: I do wish we could chat longer, but I'm having an old friend for dinner.\r\nThe length of the entered sentence is 72\r\n \r\nPlease enter a search phrase: old friend\r\nYour search phrase \"old friend\" exists in the originally entered sentence<\/pre>\n<h6>5. samm: lause moodustamine<\/h6>\n<p>Lisa programmi funktsioon, mille k\u00e4igus moodustad lihtlause.\u00a0 Lihtlause struktuur on sinu otsustada, kuid selles peab paiknema kaks l\u00fcnka, mille sisu tuleb kasutajalt k\u00fcsida. L\u00fcnkadesse k\u00e4ivate s\u00f5nade t\u00e4henduse v\u00f5i liigi otsustad ise, vastavalt millist lauset soovid moodustada (nt inimese nimi, nimis\u00f5na, tegus\u00f5na, &#8230;). \u00dcks neist kahest s\u00f5nast peab paiknema lause alguses, teise asukoht on sinu otsustada. Loodava lause pikkus on minimaalselt 4 s\u00f5na. N\u00e4iteks <span class=\"lang:default highlight:0 decode:true crayon-inline\">&lt;s\u00f5na1&gt; on &lt;s\u00f5na2&gt; nimi!<\/span> .<\/p>\n<p>Olles kasutajalt s\u00f5nad p\u00e4rinud ja programmi sisse lugenud tuleb sul need s\u00f5nad lauseks kokku kleepida. Kokku kleebitav lause peab olema salvestatud t\u00e4iesti uude t\u00fchja t\u00e4hem\u00e4rgimassiivi.<\/p>\n<p>Funktsiooni lahendamiseks pead<\/p>\n<ol>\n<li>Looma kaks s\u00f5ne t\u00fc\u00fcpi muutujat, kuhu loed kasutaja sisestatud s\u00f5ned<\/li>\n<li>Looma kolmanda s\u00f5ne, kuhu salvestad moodustatava lause (allolevas n\u00e4ites muutuja <span class=\"lang:c highlight:0 decode:true crayon-inline\">sentence<\/span>\u00a0)<\/li>\n<li>Kleepima kokku lause ja selle salvestama muutujasse\u00a0<span class=\"lang:c highlight:0 decode:true crayon-inline\">sentence<\/span><\/li>\n<li>V\u00e4ljastama moodustatud lause<\/li>\n<\/ol>\n<p>Kuna funktsioonile meil head sisendit ega tagastust anda ei ole, v\u00f5iksid alustada funktsiooni sedasi (void-void funktsioonid on erandlikud ja enamasti tasub neid v\u00e4ltida!):<\/p>\n<pre class=\"toolbar:2 lang:default decode:true\">void FormulateSentence(void)\r\n{\r\n    \/\/ String where the final sentence will be held\r\n    char sentence[ ??? ];\r\n   \r\n\r\n\r\n\r\n\r\n    \/\/ Print the final formulated sentence\r\n    printf(\"Result: %s\\n\", sentence);\r\n}<\/pre>\n<p><strong>M\u00f5tle hoolikalt l\u00e4bi s\u00f5nede pikkused! <\/strong>Massivi <span class=\"lang:default highlight:0 decode:true crayon-inline\">sentence<\/span>\u00a0 pikkus peab olema piisav, et mahutada m\u00f5lemad kasutaja sisestatavad s\u00f5nad ning lause moodustamisel sinu poolt lisatud s\u00f5nad, t\u00fchikud ja kirjavahem\u00e4rgid. Suurus v\u00f5ib olla liigkaudne aga peab olema piisav! See on eriti oluline, kui kasutaja otsustab sisestada maksimaalse v\u00f5imaliku pikkusega s\u00f5nad!<\/p>\n<div class=\"su-spoiler su-spoiler-style-fancy su-spoiler-icon-chevron su-spoiler-closed\" data-scroll-offset=\"0\" data-anchor-in-url=\"no\"><div class=\"su-spoiler-title\" tabindex=\"0\" role=\"button\"><span class=\"su-spoiler-icon\"><\/span>Lahenduseks vajalikud teadmised<\/div><div class=\"su-spoiler-content su-u-clearfix su-u-trim\">\n<p>Selle funktsiooni lahendamiseks v\u00f5id kasutada erinevaid l\u00e4henemisi.<\/p>\n<p>Sisendi lugemisel \u00e4ra unusta kasutada ohutuid lugemisfunktsioone.<\/p>\n<p>Lause kokku kleepimisel v\u00f5iksid olla huvipakkuvateks funktsioonideks <span class=\"lang:c highlight:0 decode:true crayon-inline \">strncpy()<\/span> , <span class=\"lang:c highlight:0 decode:true crayon-inline\">strncat()<\/span>\u00a0ja <span class=\"lang:c highlight:0 decode:true crayon-inline\">snprintf()<\/span> . K\u00f5iki neist korraga pole m\u00f5istlik kasutada, olenevalt lahendusest peaksid piirduma \u00fche-kahe eelnimetatud funktsiooniga.<\/p>\n<\/div><\/div>\n<h5><span class=\"ez-toc-section\" id=\"Programmi_lopptulemus\"><\/span>Programmi l\u00f5pptulemus<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<pre class=\"theme:cisco-router toolbar:1 nums:false lang:default decode:true\" title=\"string.h\">Please enter a password: password\r\nInvalid password! Try again!\r\n\r\nPlease enter a password: again\r\nInvalid password! Try again!\r\n\r\nPlease enter a password: hunter2\r\nPassword accepted. Welcome AzureDiamond!\r\n\r\nEnter a sentence: I do wish we could chat longer, but I'm having an old friend for dinner.\r\nThe length of the entered sentence is 72\r\n\r\nPlease enter a search phrase: old friend\r\nYour search phrase \"old friend\" exists in the originally entered sentence\r\n\r\nEnter a name: Pauline\r\nEnter an adjective: awesome\r\n\r\nResult: Pauline is an awesome person!<\/pre>\n<h4><span class=\"ez-toc-section\" id=\"Ulesanne_2_W13-2_CSV-st_meiliaadresside_genereerimine\"><\/span>\u00dclesanne 2 [W13-2]: CSV-st meiliaadresside genereerimine<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Selle \u00fclesande eesm\u00e4rk on sulle tutvustada laialtlevinud andmeformaati CSV (comma separated value). \u00dclesande lahendamise k\u00e4igus saad harjutada \u00fcksikute t\u00e4hem\u00e4rkide tuvastamist ja t\u00f6\u00f6tlemist.<\/p>\n<p>Lae alla \u00fclesande aluskood: <strong><a href=\"https:\/\/blue.pri.ee\/ttu\/files\/iax0583\/aluskoodid\/13_2_csv_starter.c\">13_2_csv_starter.c<\/a><\/strong><\/p>\n<h5><span class=\"ez-toc-section\" id=\"CSV_formaat\"><\/span>CSV formaat<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>CSV on struktuursete andmete hoiustamise formaat, kus iga andmev\u00e4li on eraldatud eelnevast ja j\u00e4rgnevast komaga. Tegu on t\u00f5en\u00e4oliselt k\u00f5ige levinuma andmete varundamiseks ja hoiustamiseks kasutatava formaadiga v\u00e4ljaspool andmebaasis\u00fcsteeme. Tema peamisteks eelisteks on lihtne struktuur ning sellest tingitult on CSV toetatud praktiliselt k\u00f5igis rakendustes, mis v\u00e4hegi andmetega t\u00f6\u00f6tlevad.<\/p>\n<p>K\u00f5ige lihtsamal kujul nagu \u00f6eldud on k\u00f5ik v\u00e4ljad eraldatud \u00fcksteisest komaga. N\u00e4iteks:<\/p>\n<pre class=\"toolbar:2 lang:default highlight:0 decode:true\">Mari,Maasikas,112222IACB,49001013333\r\nToomas,Toomingas,111111MVEB,39002204444<\/pre>\n<p>T\u00e4pselt sellise keerukusega andmeid vaatame ka selles tunnit\u00f6\u00f6s. N\u00e4gemaks keerulisemaid formaate ja reegleid, kuidas hoiustada v\u00e4ljasid, mis peavad sisaldama komasid, jutum\u00e4rke ning kuidas lisada pealkirju, v\u00f5id lugeda siit: <strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Comma-separated_values#Basic_rules\">https:\/\/en.wikipedia.org\/wiki\/Comma-separated_values#Basic_rules<\/a>.\u00a0<\/strong><\/p>\n<h5><span class=\"ez-toc-section\" id=\"Nouded-2\"><\/span>N\u00f5uded<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<ul>\n<li>\u00dclesande lahendus on ehitatud antud aluskoodile<\/li>\n<li>Programm loob igale aluskoodis antud inimesele e-postiaadressi.\n<ul>\n<li>e-postiaadressi nimeosa koosneb kolmest eesnimet\u00e4hest ja kolmest perenimet\u00e4hest.<\/li>\n<li>Nimeosale j\u00e4rgneb sinu valitud domeen.<\/li>\n<li>E-postiaadressi nimi ja domeen peavad koosnema vaid v\u00e4iket\u00e4htedest.<\/li>\n<li>E-postiaadress tuleb salvestada terviklikult tekstimassiivi (loo uus muutuja seal, kus vaja) ja v\u00e4ljastada selle kaudu. Jooksvalt t\u00e4hem\u00e4rkhaaval v\u00e4ljastus pole lubatud.<\/li>\n<\/ul>\n<\/li>\n<li>Programm v\u00e4ljastab:\n<ul>\n<li>Inimese t\u00e4isnime. Eesnime ja perenime osad peavad olema eraldatud t\u00fchikuga<\/li>\n<li>Genereeritud e-postiaadressi.<\/li>\n<\/ul>\n<\/li>\n<li>Aluskoodis juba olevat koodi \u00fclesande lahendamiseks muuta ei tohi ilma juhendaja poolse n\u00f5usolekuta. Sinu poolt kirjutatava lahenduse alguspunkt peaks asuma\u00a0 <span class=\"lang:default highlight:0 decode:true crayon-inline\">ProcessPerson()<\/span>\u00a0 \u00a0funktsiooni sees. Soovi korral v\u00f5id julgelt funktsioone juurde lisada.<\/li>\n<\/ul>\n<h5><span class=\"ez-toc-section\" id=\"Naide\"><\/span>N\u00e4ide<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<pre class=\"theme:cisco-router toolbar:1 nums:false lang:default highlight:0 decode:true\" title=\"CSV\">Number of CSV lines: 3\r\n\r\nProcessing line: 'Maria,Kask'\r\nName: Maria Kask\r\nE-mail: markas@ttu.ee\r\n\r\nProcessing line: 'Johanna-Maria,Kask'\r\nName: Johanna-Maria Kask\r\nE-mail: johkas@ttu.ee\r\n\r\nProcessing line: 'Kalev Kristjan,Kuusk'\r\nName: Kalev Kristjan Kuusk\r\nE-mail: kalkuu@ttu.ee<\/pre>\n<h5><span class=\"ez-toc-section\" id=\"Vihjed\"><\/span>Vihjed<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<ul>\n<li>Teades koma asukohta, tead ka mis indeksilt algab perenime esimene t\u00e4ht<\/li>\n<li>ASCII suur- ja v\u00e4iket\u00e4ht erinevad \u00fcksteisest \u00fche biti v\u00f5tta, mille j\u00e4rgu v\u00e4\u00e4rtuseks on 32 (nt A 65, a 97)<\/li>\n<li>K\u00f5ik toimingud peale e-mailiaadressi l\u00f5pu lisamise on k\u00f5ige lihtsam teha selles \u00fclesandes t\u00e4hem\u00e4rk-haaval. Saab ka kasutada <span class=\"lang:default highlight:0 decode:true crayon-inline \">string.h<\/span>\u00a0 teegi funktsioone, kuid need v\u00f5ivad olla asjatult keerukad.<\/li>\n<li>K\u00f5ige t\u00fc\u00fcpilisem viga selles \u00fclesandes on unustada s\u00f5nele null-baidi ehk terminaatori l\u00f5ppu lisamist p\u00e4rast nimeosa koostamist!<\/li>\n<\/ul>\n<h4><span class=\"ez-toc-section\" id=\"Lisaulesanne_1_W13-3_Tahtede_loendus\"><\/span>Lisa\u00fclesanne 1 [W13-3]: T\u00e4htede loendus<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Esimene lisa\u00fclesanne laiendab esimest praktilist \u00fclesannet. Selleks loo k\u00e4sitsi uus loendamise funktsioon ning v\u00e4ljasta statistika<\/p>\n<ul>\n<li>Loenda ja kuva, mitu t\u00e4hte [a-zA-Z] oli lauses. \u00c4ra loenda kirjavahem\u00e4rke, t\u00fchikuid jne.<\/li>\n<li>Leia ja kuva, mitu protsenti kogu lausest moodustasid t\u00fchikud, kirjavahem\u00e4rgid ja muud s\u00fcmbolid.<\/li>\n<li>N\u00e4ita protsent \u00fche komakohaga.<\/li>\n<\/ul>\n<p><strong>N\u00e4ide<\/strong><\/p>\n<pre class=\"theme:cisco-router toolbar:1 nums:false lang:default decode:true\" title=\"string_adv\">Sentence entered: Hi, Bob!\r\nSentence length: 8\r\nAlphabetical characters: 5\r\nPercentage of other characters: 37,5%<\/pre>\n<h4><span class=\"ez-toc-section\" id=\"Lisaulesanne_2_W13-4_CSV_laiendus\"><\/span>Lisa\u00fclesanne 2 [W13-4]: CSV laiendus<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Teine lisa\u00fclesanne on laiendus teisele praktilisele \u00fclesandele. Lisa\u00fclesande lahendamiseks t\u00e4ienda rakendust sedasi, et su lahendus tuleks toime ka t\u00e4iendava andmev\u00e4lja ja l\u00fchemate nimedega.<\/p>\n<ul>\n<li>V\u00f5ta kasutusele laiendatud andmestik<\/li>\n<li>Muuda algoritmi sedasi, et see t\u00f6\u00f6taks ka nimedega, mis sisaldavad vaid 1 v\u00f5i 2 t\u00e4hem\u00e4rki.<\/li>\n<li>Kuva linna nimi<\/li>\n<\/ul>\n<p><strong>Andmestik<\/strong><\/p>\n<pre class=\"toolbar:2 lang:c decode:true\">    const char *data[] = {\"Maria,Kask,Tallinn\",\r\n                          \"Johanna-Maria,Kask,Tartu\",\r\n                          \"Kalev,Kristjan,Kuusk,Tartu\",\r\n                          \"Margit,Kasemets,Narva\",\r\n                          \"Ly,Kase,Tapa\",\r\n                          \"Marko,Au,Loobu\",\r\n                          \"Al,Au,Viljandi\"\r\n                          };\r\n<\/pre>\n<h3><span class=\"ez-toc-section\" id=\"Parast_tundi_peaksid\"><\/span><strong>P\u00e4rast tundi peaksid<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li>Teadma, et t\u00e4hem\u00e4rkide jaoks kasutatakse erinevaid kodeeringuid, muuhulgas ASCII ja Unicode<\/li>\n<li>Teadma, mis on ASCII tabel ning kuidas seda kasutada.<\/li>\n<li>Teadma, kuidas t\u00f6\u00f6tavad s\u00f5ned C keeles.<\/li>\n<li>Teadma, kuidas l\u00f5petatakse s\u00f5net C keeles (null-terminaator\/null-bait).<\/li>\n<li>Seostama C keelseid s\u00f5nesid baidijadadega.<\/li>\n<li>Teadma, mis on CSV.<\/li>\n<li>Oskama kasutada string.h teeki s\u00f5nede manipuleerimiseks.<\/li>\n<li>Oskama ka ise kirjutada s\u00f5nede manipulatsioone (t\u00e4hem\u00e4rkhaaval l\u00e4henemine).<\/li>\n<li>Teadma, mis asi on puhvri \u00fclet\u00e4itumine ning selle kaudu tehtavatest r\u00fcnnakutest.<\/li>\n<\/ul>\n<h3><span class=\"ez-toc-section\" id=\"Taiendav_materjal\"><\/span><span id=\"Additional_content\" class=\"ez-toc-section\"><\/span><strong>T\u00e4iendav materjal<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li>Characters, Symbols and the Unicode Miracle &#8211; Computerphile<br \/>\n<strong><a href=\"https:\/\/www.youtube.com\/watch?v=MijmeoH9LT4\">https:\/\/www.youtube.com\/watch?v=MijmeoH9LT4<\/a><\/strong><\/li>\n<li>A beginners guide away from scanf<br \/>\n<strong><a href=\"https:\/\/www.sekrit.de\/webdocs\/c\/beginners-guide-away-from-scanf.html\">https:\/\/www.sekrit.de\/webdocs\/c\/beginners-guide-away-from-scanf.html<\/a><\/strong><\/li>\n<li>ASCII<br \/>\n<strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/ASCII\">https:\/\/en.wikipedia.org\/wiki\/ASCII<\/a><\/strong><\/li>\n<li>ASCII table<br \/>\n<strong><a href=\"https:\/\/www.rapidtables.com\/code\/text\/ascii-table.html\">https:\/\/www.rapidtables.com\/code\/text\/ascii-table.html<\/a><\/strong><\/li>\n<li>Character encoding<br \/>\n<strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Character_encoding\">https:\/\/en.wikipedia.org\/wiki\/Character_encoding<\/a><\/strong><\/li>\n<li>String.h library<br \/>\n<strong><a href=\"https:\/\/www.cplusplus.com\/reference\/cstring\/\">https:\/\/www.cplusplus.com\/reference\/cstring\/<\/a><\/strong><\/li>\n<li>Strings in C<br \/>\n<strong><a href=\"https:\/\/www.geeksforgeeks.org\/strings-in-c-2\/\">https:\/\/www.geeksforgeeks.org\/strings-in-c-2\/<\/a><\/strong><\/li>\n<li>CSV<br \/>\n<strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Comma-separated_values\">https:\/\/en.wikipedia.org\/wiki\/Comma-separated_values<\/a><\/strong><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Praktikumi materjal Slaidid: S\u00f5ned N\u00e4ide:\u00a0m\u00f5ningad lihtsamad t\u00e4hem\u00e4rkide omistamised Esitamisele kuuluvad \u00fclesanded Selles tunnis on kaks \u00fclesannet, millest esimeses \u00f5pime tundma string.h teeki ning teises manipuleerime t\u00e4hem\u00e4rke k\u00e4sitsi. \u00dclesanne 1 [W13-1]: Tutvume string.h teegiga Selle \u00fclesande k\u00e4igus lood samm-sammu haaval programmi, mille k\u00e4igus tutvud peamiselt erinevate string.h teegis olevate standardfunktsioonidega. N\u00f5uded Programmi koostamiseks liigu samm-sammult juhendis &hellip; <a href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr1-et\/pr1et13-soned\/\" class=\"more-link\">Loe edasi <span class=\"screen-reader-text\">PR1ET13: S\u00f5ned<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[97,94],"tags":[],"class_list":["post-6495","post","type-post","status-publish","format-standard","hentry","category-laborid","category-pr1-et"],"_links":{"self":[{"href":"https:\/\/blue.pri.ee\/ttu\/wp-json\/wp\/v2\/posts\/6495","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blue.pri.ee\/ttu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blue.pri.ee\/ttu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blue.pri.ee\/ttu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blue.pri.ee\/ttu\/wp-json\/wp\/v2\/comments?post=6495"}],"version-history":[{"count":21,"href":"https:\/\/blue.pri.ee\/ttu\/wp-json\/wp\/v2\/posts\/6495\/revisions"}],"predecessor-version":[{"id":11781,"href":"https:\/\/blue.pri.ee\/ttu\/wp-json\/wp\/v2\/posts\/6495\/revisions\/11781"}],"wp:attachment":[{"href":"https:\/\/blue.pri.ee\/ttu\/wp-json\/wp\/v2\/media?parent=6495"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blue.pri.ee\/ttu\/wp-json\/wp\/v2\/categories?post=6495"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blue.pri.ee\/ttu\/wp-json\/wp\/v2\/tags?post=6495"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}