Kirjoittaja Aihe: Syötteen tietotyypin tarkistus C:ssä [RATKAISTU]  (Luettu 6822 kertaa)

Jere Sumell

  • Käyttäjä
  • Viestejä: 742
  • Talous, Hallinto ja Markkinointi (AMK, 2017),B.B.A
    • Profiili
    • Tietokone-blogi
Mitenkäs C-kielessä voisi tarkistaa syötteen tietotyypin? Esimerkkinä tällainen ohjelma, kun laskee kertoman komentorivin parametrista, pitäisi tarkistaa, onko syöten int-tyyppiä, eikä negatiivinen eikä muumerkkijono

Koodia: [Valitse]
#include <stdio.h>

//Declaring function(s)
int kertoma(int x);

int kertoma(int x) {
    if (x<=0) {
    return 1;
    }
    return (x*kertoma(x-1));
}
//Main Method
int main(int argc, char *argv[]) {
    if (argc <=1) {
        printf("Syötä parametrina luku, jonka kertoman tuloksen haluat selvittää!");
    }
    else
    {
        int tulos;
        int input = atoi(argv[1]);
        tulos = kertoma(input);
        printf("%d",tulos);
    }
}

Minimalistisin keino olisi vähiten koodia että tarvitsisi kirjoittaa, lyhtentäisin koodia

Koodia: [Valitse]
#include <stdio.h>

//Declaring function(s)
int kertoma(int x);

int kertoma(int x) {
    if (x<=0) {
    return 1;
    }
    return (x*kertoma(x-1));
}
//Main Method
int main(int argc, char *argv[]) {
    if (argc <=1) {
        printf("Syötä parametrina luku, jonka kertoman tuloksen haluat selvittää!");
    }
    else
    {

        printf("%d",kertoma(atoi(argv[1]));
    }
}

Eli eliminoisin tarvittavien muuttujien sijoitusoperaatiot lauseella

Koodia: [Valitse]
printf("%d",kertoma(atoi(argv[1]));
Meneekö se ihan tuossa haarautumis-ehtolausekohdassa tuolla
if (argc <=1 ), vai miten tuon syötteen tyypin voisi tarkistaa, että jos käyttäjä syöttää esimerkiksi stringin

« Viimeksi muokattu: 12.02.21 - klo:12.38 kirjoittanut Jere Sumell »
Free Internet and  people for humans all over the globe!

(Profiilikuvassa oma valokuvani GIMPissä editoituna Disney Classic-väripaletin väreihin ja muunnettuna bittikartta-tiedostosta vektorigrafiikaksi.)

Jere Sumell

  • Käyttäjä
  • Viestejä: 742
  • Talous, Hallinto ja Markkinointi (AMK, 2017),B.B.A
    • Profiili
    • Tietokone-blogi
Vs: Syötteen tietotyypin tarkistus C:ssä
« Vastaus #1 : 12.02.21 - klo:10.09 »
Kävi mielessä, että kun C-kieli käsittelee char-taulukkona komentorivin syötteet, niin pitäisikö joka tietotyypille kirjoittaa jokin ylikuormitettu (overload) "tulosta" -metodi, jossa merkkijono muunnettaisiin yhdessä intiksi, jos liukuluku syötetään, sitten toisessa pyöristettäisiin lähimpään kokonaislukuun edellyttäen tietenkin, että ohjelma alussa sisällytettäisiin matematiikka-kirjasto käyttöön, mutta ongelma on edelleen jonkin aakkosia sisältävän käyttäjän syötteen tarkistus.

Palaa siihen kysymyseen, että pitäisi löytyä jokin keino tarkistaa tietotyyppi, että se olisi int, muuten ohjelma herjaa siitä tai ei tulosta mitään.
Free Internet and  people for humans all over the globe!

(Profiilikuvassa oma valokuvani GIMPissä editoituna Disney Classic-väripaletin väreihin ja muunnettuna bittikartta-tiedostosta vektorigrafiikaksi.)

Ganymedes

  • Käyttäjä
  • Viestejä: 3915
    • Profiili
Vs: Syötteen tietotyypin tarkistus C:ssä
« Vastaus #2 : 12.02.21 - klo:10.52 »
Enpä tunne kieltä tarpeeksi, mutta eikös se stringin voi vain (tyhjien poiston jälkeen) yrittää konvertoida INT:ksi? Jos ei pääty virheeseen, niin on oikein. Virheellä taas mennään virheenkäsittelyn alirutiiniin - mikä se se sitten onkaan näille tapauksille (jos on useita samanlaisia, jotka voi hoitaa vain eri parametrillä, muutoin tälle on vain oma rutiininsa).

Jere Sumell

  • Käyttäjä
  • Viestejä: 742
  • Talous, Hallinto ja Markkinointi (AMK, 2017),B.B.A
    • Profiili
    • Tietokone-blogi
Vs: Syötteen tietotyypin tarkistus C:ssä
« Vastaus #3 : 12.02.21 - klo:11.30 »
Enpä tunne kieltä tarpeeksi, mutta eikös se stringin voi vain (tyhjien poiston jälkeen) yrittää konvertoida INT:ksi? Jos ei pääty virheeseen, niin on oikein. Virheellä taas mennään virheenkäsittelyn alirutiiniin - mikä se se sitten onkaan näille tapauksille (jos on useita samanlaisia, jotka voi hoitaa vain eri parametrillä, muutoin tälle on vain oma rutiininsa).

varmaan toi stringistä intiksi muunnosmetodi palauttaa intin, ja en tiedä, jos se olisi boolean tyyppinen palautusarvo, että jos muunto onnistuu, niin sitten tämä olisi ratkaistavissa sillä, mutta en tiedä mitä arvoja atoi-palauttaa, jos muunnos epäonnistuu jostain syystä. Katsoin Tutorialspointista Google-haulla "C language refence atoi" -hakutermillä, niin Tutorialspointissa metodin määrittely APIssa on seuraava

Koodia: [Valitse]
int atoi(const char *str)Kyseisessä artikkelissa ei kerrota, mikä palautusarvo sitten on, jos muunto epäonnistuu. joku intti se on, mutta mikä, tiedostonluvussa yleensä on -1 sitten kun EOF -saavutetaan, mutta -1 on validi  arvo, joka sijoittuu int-primaarimuuttujan arvo-alueeseen, joten se ei ole se tässä tilanteessa. Tietenkin voisi kokeilla, mitä se palauttaa ja käyttää tarkistuksessa sitä arvoa, jos se on jokin nullin kaltainen.

Tuo ohjelmanihan toimii vain niissä tapauksissa ongelmitta, jossa käyttäjä toimii "rehellisesti" annettujen sääntöjen ja puitteiden rajoissa, että antaa positiivisen kokonaisluvun, mutta siihen pitäisi vielä lisätä kaksi tarkistusta, eli tuo int-tyypin tarkistus, ja sen jälkeen vielä että luku on positiivinen, tai suurempi kuin 0, koska negatiivisista luvuista ei voi kertomaa laskea. Liukuluku-syötekään tuota niin paljon ongelmia, kuin aakkos- tai erikoismerkkipohjainen syöte.

Tietysti, jos tarkistaisi, että syöte on etumerkitön int, niin se poissulkisi -0 ja muut negatiiviset luvut, mutta juuri se kysymys, että onko sitä miten mahdollista varmistua siitä, että käyttäjä syöttää nimenomaan int-tyyppisen positiivisen luvun.

Tämä on juuri tätä poikkeus-ja ongelatilanteiden ohjelmointia, jolla ei itsessään ohjelmoinnin oppimisen kannalta ole juuri muuta merkitystä, muuta kuin jos teollisuuskoodaauksessa kuluu juuri tämän kaltaisiin paljon aikaa, kun pitää ajatella loppukäyttäjän näkökulmasta.
« Viimeksi muokattu: 12.02.21 - klo:11.39 kirjoittanut Jere Sumell »
Free Internet and  people for humans all over the globe!

(Profiilikuvassa oma valokuvani GIMPissä editoituna Disney Classic-väripaletin väreihin ja muunnettuna bittikartta-tiedostosta vektorigrafiikaksi.)

Ganymedes

  • Käyttäjä
  • Viestejä: 3915
    • Profiili
Vs: Syötteen tietotyypin tarkistus C:ssä
« Vastaus #4 : 12.02.21 - klo:11.47 »
OK, mutta olettaisin, että tulee ERROR ja ohjelma kaatuu - tuonhan voit kokeillakin.

Löytyykö joku:

On Error Goto Virhetilanne, (Palautusarvo, "INT muunnos virhe")

, jolloin Virhetilanne alirutiini voi tulostaa ruudulle miksi ohjelma päätyi virheeseen, ja tehdä lisäksi mitä hyvänsä.

Virherutiini sitten palauttaa ohjelman takaisin parametrin kanssa ja pääohjelmassa jatketaan ehtolauseella, jossa testataan käytiinkö virheenkäsittelyssä vai ei ja toimitaan sen mukaan erilailla (joko jatketaan tai pyydetään uudestaan tai annetaan vaihtoehto lopettaa ohjelma).

Jatkettaessa tehdään negatiiviselle arvolle jotakin ... mutta sehän on eri (otetaan itseisarvo tai pyydetään uutta tai annetaan mahdollisuus lopettaa). Itse asiassa tämä INPUT-toimintokin on näköjään oma alirutiininsa, koska siinä on toistuvuutta jo näissä kahdessa kuvatussa asiassa.

... jotain tällaista noin periaatteessa. Sorry, en tiedä syntakseista mitään.

SuperOscar

  • Käyttäjä
  • Viestejä: 4063
  • Ocatarinetabellatsumtsum!
    • Profiili
    • Legisign.org
Vs: Syötteen tietotyypin tarkistus C:ssä
« Vastaus #5 : 12.02.21 - klo:12.13 »
Heh, atoi() on tasan niin typerä miksi Unix Hater’s Handbook koko C-kieltä manaa: jollei muunnos onnistu, palautuu vain arvo 0. Mikä tahansa merkkijono on siis oletusarvoisesti kokonaisluku nolla.
pöytäkone 1, NUC: openSUSE Leap 15.6, kannettavat 1–3: Debian GNU/Linux 12; pöytäkone 2: openSUSE Tumbleweed; RPi 1: FreeBSD 14-RELEASE; RPi 2: LibreELEC 11

_Pete_

  • Käyttäjä
  • Viestejä: 1845
  • Fufufuuffuuu
    • Profiili
Vs: Syötteen tietotyypin tarkistus C:ssä
« Vastaus #6 : 12.02.21 - klo:12.17 »
Kävi mielessä, että kun C-kieli käsittelee char-taulukkona komentorivin syötteet, niin pitäisikö joka tietotyypille kirjoittaa jokin ylikuormitettu (overload) "tulosta" -metodi, jossa merkkijono muunnettaisiin yhdessä intiksi, jos liukuluku syötetään, sitten toisessa pyöristettäisiin lähimpään kokonaislukuun edellyttäen tietenkin, että ohjelma alussa sisällytettäisiin matematiikka-kirjasto käyttöön, mutta ongelma on edelleen jonkin aakkosia sisältävän käyttäjän syötteen tarkistus.

Palaa siihen kysymyseen, että pitäisi löytyä jokin keino tarkistaa tietotyyppi, että se olisi int, muuten ohjelma herjaa siitä tai ei tulosta mitään.

Ei pitäisi koska a) c:ssä ei ole ylikuormitusta ollenkaan b) eikä myöskään metodeita.


_Pete_

  • Käyttäjä
  • Viestejä: 1845
  • Fufufuuffuuu
    • Profiili
Vs: Syötteen tietotyypin tarkistus C:ssä
« Vastaus #7 : 12.02.21 - klo:12.22 »
Itse merkkijono -> int scanf voisi toimia paremmin vs atoi.

Se pelauttaa onnistuko muunnos ja sillä voi siten ilmoittaa virheen ei numeroksi kelpaamattomasta inputista.

Jere Sumell

  • Käyttäjä
  • Viestejä: 742
  • Talous, Hallinto ja Markkinointi (AMK, 2017),B.B.A
    • Profiili
    • Tietokone-blogi
Vs: Syötteen tietotyypin tarkistus C:ssä
« Vastaus #8 : 12.02.21 - klo:12.37 »
Tsekkasin tuon palautusarvon "laittomilla" syötteillä, niin jos syöttää aakkosellista merkkijonotietoa  tai negatiivisen arvon, niin palautuu 1. Ratkaisin ongelman, että ensin lasken joka tapauksessa kertoman tuloksen, ja sitten ehtolause, jossa tulostetaan ohje sen jälkeen, jos kertoma- no, alirutiini tai metodi, mitä puhun metodeista myös proseduraalisessa ja funktionaalisen ohjelmoinnin kielissä, niin jos se palauttaa tuon ykösen.

Lopullinen koodini
Koodia: [Valitse]
#include <stdio.h>

//Declaring function(s)
int kertoma(int x);

int kertoma(int x) {
    if (x<=0) {
    return 1;
    }
    return (x*kertoma(x-1));
}
//Main Method
int main(int argc, char *argv[]) {

    int tulos = kertoma(atoi(argv[1]));
    if (tulos >1)
    {
        printf("%d", tulos);

    }
    else
    {
        printf("Parametri ei ole kokonaisluku, tai kertoman tulos on 1!");
    }

}

Muistan nuo "goto" -lausekkeet Ms DOS-ajoilta, joskus kun lapsena kokeilin Q-BASICilla tehdä yksinkertaisia ohjelmia, noita goto-lauseita pitäisi vältellä, koska muuttujien arvot voivat olla mitä tahansa siinä kohtaa, kun hyppää johonkin tiettyyn kohtaan koodia tuolla goto-käskyllä ja ohjelman suoritus ei välttämättä onnistu tai jokin menee siinäkin pieleen. En edes tiedä, onko C-kielessäkään go
« Viimeksi muokattu: 12.02.21 - klo:15.16 kirjoittanut Jere Sumell »
Free Internet and  people for humans all over the globe!

(Profiilikuvassa oma valokuvani GIMPissä editoituna Disney Classic-väripaletin väreihin ja muunnettuna bittikartta-tiedostosta vektorigrafiikaksi.)

nm

  • Käyttäjä
  • Viestejä: 16429
    • Profiili
Vs: Syötteen tietotyypin tarkistus C:ssä
« Vastaus #9 : 12.02.21 - klo:12.39 »
Kannattaa käyttää strtol-funktiota, jonka avulla voi selvittää täsmälleen, mikä vika syötteessä on. Myös funktio strtoul on olemassa, mutta se tulkitsee miinus-etumerkin negaatioksi ja muuntaa luvun sitten unsignediksi, jota tässä tuskin halutaan. Liukuluvuille on strtod.

C-ohjelmoinnissa manuaalisivut ovat hyvä tietolähde standardikirjaston osalta, joskin ne vaativat jonkin verran esitietoja mm. C:n tavallisista virheenkäsittelymekanismeista.

Koodia: [Valitse]
man strtol
Pari nettilähdettä, joissa on lisää esimerkkejä:
https://www.cplusplus.com/reference/cstdlib/strtol/
https://www.techonthenet.com/c_language/standard_library_functions/stdlib_h/strtol.php

Jere Sumell

  • Käyttäjä
  • Viestejä: 742
  • Talous, Hallinto ja Markkinointi (AMK, 2017),B.B.A
    • Profiili
    • Tietokone-blogi
Vs: Syötteen tietotyypin tarkistus C:ssä
« Vastaus #10 : 12.02.21 - klo:12.41 »
Heh, atoi() on tasan niin typerä miksi Unix Hater’s Handbook koko C-kieltä manaa: jollei muunnos onnistu, palautuu vain arvo 0. Mikä tahansa merkkijono on siis oletusarvoisesti kokonaisluku nolla.

Käytän Codeblock-IDEä tässä C-koodauksessa Mint-koneellani, niin gcc-kääntäjällä käännösvaiheessa tulee jokin varoitusherja tuosta atoi:n käytöstä, mutta ohjelma silti kääntyy, ja kun sen ajaa, niin toimii moitteetta.

En ole lukenut tuota Unix Hater's Handbookkia, mikä tämä tarina tässä atoin takana on, että siitä ei niin tykättäisi?
Free Internet and  people for humans all over the globe!

(Profiilikuvassa oma valokuvani GIMPissä editoituna Disney Classic-väripaletin väreihin ja muunnettuna bittikartta-tiedostosta vektorigrafiikaksi.)

nm

  • Käyttäjä
  • Viestejä: 16429
    • Profiili
Vs: Syötteen tietotyypin tarkistus C:ssä
« Vastaus #11 : 12.02.21 - klo:12.47 »
Käytän Codeblock-IDEä tässä C-koodauksessa Mint-koneellani, niin gcc-kääntäjällä käännösvaiheessa tulee jokin varoitusherja tuosta atoi:n käytöstä, mutta ohjelma silti kääntyy, ja kun sen ajaa, niin toimii moitteetta.

Liittyisikö siihen, että atoi() sijaitsee stdlib.h:ssa, jolle koodissasi ei ole include-riviä?


mikä tämä tarina tässä atoin takana on, että siitä ei niin tykättäisi?

Eipä siinä muuta tarinaa ole kuin itsekin havaitsemasi virheenkäsittelyn puuttuminen. Ohjelmointikielet ja kirjastot ovat kuitenkin ehtineet kehittyä 50 vuodessa, eikä C-kielikään ole täysin toivoton tapaus, vaikka sen turvallinen käyttö edellyttää melko paljon asiantuntemusta.
« Viimeksi muokattu: 12.02.21 - klo:12.51 kirjoittanut nm »

Ganymedes

  • Käyttäjä
  • Viestejä: 3915
    • Profiili
Vs: Syötteen tietotyypin tarkistus C:ssä
« Vastaus #12 : 12.02.21 - klo:12.58 »
...
Muistan nuo "goto" -lausekkeet Ms DOS-ajoilta, joskus kun lapsena kokeilin Q-BASICilla tehdä yksinkertaisia ohjelmia, noita goto-lauseita pitäisi vältellä, koska muuttujien arvot voivat olla mitä tahansa siinä kohtaa, kun hyppää johonkin tiettyyn kohtaan koodia tuolla goto-käskyllä ja ohjelman suoritus ei välttämättä onnistu tai jokin menee siinäkin pieleen. En edes tiedä, onko C-kielessäkään go

Muistan hyvin tuon keskustelun. Se oli jo 70-luvun lopussa pateettista, koska esim. HP:n työasemissa oli jo silloin ohjelmointikielessä oikeat aliohjelmat eikä näitä ehdottomia GOTO-lauseita tarvittu koskaan.

Tarkoitin tuossa aliohjelmakutsua, joka voi olla muotoa ON ERROR GOTO ALIOHJELMA -virheenkäsittelyssä (esim. Microsoft VB:ssä on jotakin tuollaista). Se mistä aiemmin keskusteltiin oli GOTO hypäten johonkin kohtaa ohjelmaa pysyvästi, ei ehdollisesti. Täysin eri asioita.

Olen huomannut että kunnollista virheenkäsittelyä ei usein toteuteta ja ohjelma kaatuilevat milloin sattuu, varsinkin tällaiset näppärät pikkuohjelmat. Tuollaisilla On Error Goto -rakenteille saa lähes täydellisen virheenkäsittelyn (suht. yksinkertaisessa ohjelmassa), joka ei kaadu koskaan. Se voi kuitenkin jäädä vielä jumiin, siis pelkällä tuolla, muttei kaadu. Koodia tulee tästä käsittelystä paljon lisää, mutta ei lyhyt koodi todellisuudessa ole mikään itseisarvo vaan looginen ja selvälukuinen koodi paremminkin on.

Ganymedes

  • Käyttäjä
  • Viestejä: 3915
    • Profiili
Vs: Syötteen tietotyypin tarkistus C:ssä [RATKAISTU]
« Vastaus #13 : 12.02.21 - klo:13.16 »
Tarkoitin siis tämän linkin takaa löytyvää petoa, taitaa HP 9845 olla varsinainen nimi. Tässä oli jo Basic, missä oli jo kunnolliset aliohjelmat, joista voi palata takaisin ja välittää parametrejä.

https://www.hpmuseum.net/display_item.php?hw=149

_Pete_

  • Käyttäjä
  • Viestejä: 1845
  • Fufufuuffuuu
    • Profiili
Vs: Syötteen tietotyypin tarkistus C:ssä [RATKAISTU]
« Vastaus #14 : 12.02.21 - klo:13.19 »
Tarkoitin siis tämän linkin takaa löytyvää petoa, taitaa HP 9845 olla varsinainen nimi. Tässä oli jo Basic, missä oli jo kunnolliset aliohjelmat, joista voi palata takaisin ja välittää parametrejä.

https://www.hpmuseum.net/display_item.php?hw=149

Cool! Muistatko mikä basic versio oli käytössä missä oli tuollaiset ominaisuudet?


Ganymedes

  • Käyttäjä
  • Viestejä: 3915
    • Profiili
Vs: Syötteen tietotyypin tarkistus C:ssä [RATKAISTU]
« Vastaus #15 : 12.02.21 - klo:13.47 »
Tarkoitin siis tämän linkin takaa löytyvää petoa, taitaa HP 9845 olla varsinainen nimi. Tässä oli jo Basic, missä oli jo kunnolliset aliohjelmat, joista voi palata takaisin ja välittää parametrejä.

https://www.hpmuseum.net/display_item.php?hw=149

Cool! Muistatko mikä basic versio oli käytössä missä oli tuollaiset ominaisuudet?

Varmaan joku HP-Basic ... en muista muuta nimeä. Tuon jälkeen kesti hetken ymmärtää tavanomaisten tietokoneiden toimintaperiaatteita :)  Tarkoitan tällä sitä, että ohjelmointi, käyttö ja rauta olivat integroituja. Esimerkiksi ohjelmien ajo, stepit ja pysäytykset toimivat sitä varten tehdyiltä näppäimiltä - eli rauta oli suoraan tehty ohjelma ajoon. Mitään erityistä ohjelmointikielen latausta ei ollut olemassa vaan se kuului kokonaisuuteen.

Sinänsä ominaisuudet olivat aika vakuuttavat tuohon aikaan:

- integroitu grafiikka. Eli siis pystyi suoraan ohjelmoimaan grafiikkaa ruudulle
- nauhurit massamuisteina ja muiden ohjelmien lataukseen. Muistaakseni erityiset matematiikkafunktiot sai käyttöönsä tämän kautta.
- lämpökirjoitin integroituna joka osasi tulostaa grafiikkaa (matriisikirjoittimet jylläsivät noihin aikoihin muualla)
- floppy-asema, erillinen. Ihmettelin pitkään, että miksi floppyjä pidettiin yleisesti epäluotettavina, koska eiväthän ne vikaantuneet koskaan. No, tämä floppyasema oli ISO ja flopyt ISOja.

Hintakin oli ihan kiva - käsittääkseni luokkaa 35 000 euroa (n. 200 000 markkaa), joka oli paljon siihen aikaan. Myöhemmin näin, että näitä koneita käytettiin mm. USAn satelliittiohjauskeskuksissa - varmaan vieläkin jos kyseiset satelliitit eivät ole jo pudonneet alas. Keravan aurinkokylän ohjaus toteutettiin tällaisella.

_Pete_

  • Käyttäjä
  • Viestejä: 1845
  • Fufufuuffuuu
    • Profiili
Vs: Syötteen tietotyypin tarkistus C:ssä [RATKAISTU]
« Vastaus #16 : 12.02.21 - klo:13.54 »

Varmaan joku HP-Basic ... en muista muuta nimeä. Tuon jälkeen kesti hetken ymmärtää tavanomaisten tietokoneiden toimintaperiaatteita :)  Tarkoitan tällä sitä, että ohjelmointi, käyttö ja rauta olivat integroituja. Esimerkiksi ohjelmien ajo, stepit ja pysäytykset toimivat sitä varten tehdyiltä näppäimiltä - eli rauta oli suoraan tehty ohjelma ajoon. Mitään erityistä ohjelmointikielen latausta ei ollut olemassa vaan se kuului kokonaisuuteen.


Tästä muistuu mielee kun 80-luvulla pääsin viikoksi työharjoitteluun ylä-asteella Turun atk-keskukseen. Siellä oli vastaavia keskuskonevekottimia mihi piti vaihdella nauhoja nauhaasemaan + syöttää 8" lerppuja aina kun ajettavaa ohjelmaa vaihdettiin.

Jere Sumell

  • Käyttäjä
  • Viestejä: 742
  • Talous, Hallinto ja Markkinointi (AMK, 2017),B.B.A
    • Profiili
    • Tietokone-blogi
Vs: Syötteen tietotyypin tarkistus C:ssä
« Vastaus #17 : 12.02.21 - klo:15.03 »
Kannattaa käyttää strtol-funktiota, jonka avulla voi selvittää täsmälleen, mikä vika syötteessä on. Myös funktio strtoul on olemassa, mutta se tulkitsee miinus-etumerkin negaatioksi ja muuntaa luvun sitten unsignediksi, jota tässä tuskin halutaan. Liukuluvuille on strtod.

C-ohjelmoinnissa manuaalisivut ovat hyvä tietolähde standardikirjaston osalta, joskin ne vaativat jonkin verran esitietoja mm. C:n tavallisista virheenkäsittelymekanismeista.

Koodia: [Valitse]
man strtol
Pari nettilähdettä, joissa on lisää esimerkkejä:
https://www.cplusplus.com/reference/cstdlib/strtol/
https://www.techonthenet.com/c_language/standard_library_functions/stdlib_h/strtol.php

Voisitko arvon "nm" kirjoittaa auki lähdekoodin ja pistää jakoon tuon strtol -ratkaisumallin? Mitä pari kesää sitten kesällä 2019 käytin aikaa tähän C-kieleen perehtymiseen, niin jäi vähän vähälle huomiolle nuo pointterit ja osoittimet, vaikka ne ovat ehdottoman tärkeitä hallita, jos meinaa C:llä ohjelmoida, tai C++:lla. En oikein käsitä niitä vieläkään, pitäisi varmaan jokin tehopreppaus olla paikallaan, ja ottaa ne haltuun. Tuolla antamaassasi referenssilähteessä annetaan tuolle strtol-funktion määrittelystä päätellen syöteparametriksi viittausmuuttuja, vai pointterimuuttuja, jos sellaista on & -aloitusmerkistä päätellen, niin en handlaa, miten tuo toimisi tässä alkuperäisessä kertoma käyttäjän komentokehoite parametrisyötteestä ohjelmassa.
Free Internet and  people for humans all over the globe!

(Profiilikuvassa oma valokuvani GIMPissä editoituna Disney Classic-väripaletin väreihin ja muunnettuna bittikartta-tiedostosta vektorigrafiikaksi.)

Jere Sumell

  • Käyttäjä
  • Viestejä: 742
  • Talous, Hallinto ja Markkinointi (AMK, 2017),B.B.A
    • Profiili
    • Tietokone-blogi
Vs: Syötteen tietotyypin tarkistus C:ssä
« Vastaus #18 : 12.02.21 - klo:15.27 »
Käytän Codeblock-IDEä tässä C-koodauksessa Mint-koneellani, niin gcc-kääntäjällä käännösvaiheessa tulee jokin varoitusherja tuosta atoi:n käytöstä, mutta ohjelma silti kääntyy, ja kun sen ajaa, niin toimii moitteetta.

Liittyisikö siihen, että atoi() sijaitsee stdlib.h:ssa, jolle koodissasi ei ole include-riviä?

Tuohonhan se näköjään liittyikin. Oli jostain syystä unohtunut sieltä. Kääntäjä kuitenkin olli sen verran "älykäs" näköjään, että osasi toimivan ohjelman silti kääntää.

Määrittelin kirjastoa käytettäväksi importaten tai sisällyttäen ohjelmassa käytetäväksi koodin alkuun lisäten
Koodia: [Valitse]
#include <stdlib.h>
Nyt se kääntyy ilman mitään ilmoitusta oikein, ja suoriutuu haluamastani tehtäåvästä oikein. Vielä kun saisi esimerkin tuosta "nm":n kertomasta strtol -funktion käytöstä, niin saisi ohjelmasta ehkä lopulta "oikein" toimivan. Tällä hetkellä kertoma-laskuri-ohjelmassani onko se sitten looginen vai semanttinen virhe, kun nyt joka syötteelle lasketaan kertoma, ja resursseja säästyisi, jos laskettaisiin vain syötteille, jotka ovat sen kokoisia positiivisia kokonaislukuja, että tulos mahtuisi primaarimuuttujan arvoalueeseen.

etumerkiuttömässä longissahan jos se muuntaa luvun yksi yhteen intiksi, niin on paljon laajempi arvoalue, ja onko tarvittava muistimääräkin, mikä muistista varataan, pienempi, kun pelkästään positiiviset arvot noteerataan.

Free Internet and  people for humans all over the globe!

(Profiilikuvassa oma valokuvani GIMPissä editoituna Disney Classic-väripaletin väreihin ja muunnettuna bittikartta-tiedostosta vektorigrafiikaksi.)

_Pete_

  • Käyttäjä
  • Viestejä: 1845
  • Fufufuuffuuu
    • Profiili
Vs: Syötteen tietotyypin tarkistus C:ssä
« Vastaus #19 : 12.02.21 - klo:15.37 »

Voisitko arvon "nm" kirjoittaa auki lähdekoodin ja pistää jakoon tuon strtol -ratkaisumallin? Mitä pari kesää sitten kesällä 2019 käytin aikaa tähän C-kieleen perehtymiseen, niin jäi vähän vähälle huomiolle nuo pointterit ja osoittimet, vaikka ne ovat ehdottoman tärkeitä hallita, jos meinaa C:llä ohjelmoida, tai C++:lla. En oikein käsitä niitä vieläkään, pitäisi varmaan jokin tehopreppaus olla paikallaan, ja ottaa ne haltuun. Tuolla antamaassasi referenssilähteessä annetaan tuolle strtol-funktion määrittelystä päätellen syöteparametriksi viittausmuuttuja, vai pointterimuuttuja, jos sellaista on & -aloitusmerkistä päätellen, niin en handlaa, miten tuo toimisi tässä alkuperäisessä kertoma käyttäjän komentokehoite parametrisyötteestä ohjelmassa.

Minusta tähän C pointteri juttuun on hyvä lähestymistapa se että miettii miten tietokoneen muisti oikeasti muodostuu tavu tavulta. pseudokoodauskielellä muisti on taulukko joka alkaa 0 ja päättyy siihen mihin asti on muistia (= käytännössä cpu bittisyys).


Sen jälkeen mikä ero on sillä että muistiosoitteeseen 100 pistetään luku ja sillä että on osoitin muistiosotteeseen 100.