merkkijono aliohjelmasta aliohjelmaan

syöttö ja tulostustietoa

Siis miten tämä oikein tehdään

eli funktiolla kysy pitää kysyä vaikkapa nimi.
Tämä kysytty nimi pitää tulostaa tulostus-funktiolla tulostaa.

Osaan kyllä tuon tehdä esimerkiksi kokonaisluvulla, mutta jostain syystä "saman kaavan" mukaan ei toimi merkkijonolla.

26

1255

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • mikä tässä on väärin

      void kysy_nimi();

      char nimi[20]

      nimi[20]=kysy_nimi();

      /****nimen kysymisaliohjelma******/
      void kysy_nimi()
      {
      char nimi;
      printf("Anna nimi:");
      scanf("%s", nimi);
      return nimi;
      }

      Toimii sen verran että kysyy nimeä,mutta kyykkää heti kun painaa enteriä. Dev-Cpp ei anna mitään erroria tai warningia.

      • osittain toimii

        void kysy_nimi()
        {
        char nimi[20]; /*tällä voi olla sama nimi*/
        printf("Anna nimi:");
        scanf("%s", nimi[20]);
        return nimi[20];
        }

        nyt toimii tuo kysyminen, ei kaadu heti.

        Mutta jos heti tuon jälkeen yritän tulostaa tuota ihan normaalisti pääohjelmassa printf-funktiolla, tulee jotain siansaksaa.

        Ja ongelmana on yhä miten tupn nimi[20]-muuttujan tieto viedään tulostus-aliohjelmaan. Miten merkkijono kirjataan parametriksi.

        (vittu että on perseestä kun ei missään opetusaineistossa ole tällaisia asioita, kaikennäköistä muuta diipadaapaa kyllä on mutta just näitä spekiaalihommia ei. Saatana, taidan vetäistä kännit.)


      • vaan näin
        osittain toimii kirjoitti:

        void kysy_nimi()
        {
        char nimi[20]; /*tällä voi olla sama nimi*/
        printf("Anna nimi:");
        scanf("%s", nimi[20]);
        return nimi[20];
        }

        nyt toimii tuo kysyminen, ei kaadu heti.

        Mutta jos heti tuon jälkeen yritän tulostaa tuota ihan normaalisti pääohjelmassa printf-funktiolla, tulee jotain siansaksaa.

        Ja ongelmana on yhä miten tupn nimi[20]-muuttujan tieto viedään tulostus-aliohjelmaan. Miten merkkijono kirjataan parametriksi.

        (vittu että on perseestä kun ei missään opetusaineistossa ole tällaisia asioita, kaikennäköistä muuta diipadaapaa kyllä on mutta just näitä spekiaalihommia ei. Saatana, taidan vetäistä kännit.)

        void kysy_nimi()
        {
        char nimi[20]; /*tällä voi olla sama nimi*/
        printf("Anna nimi:");
        scanf("%s", nimi);
        return nimi[20];
        }


      • oikeaa tietoa nimi-muuttujaan
        vaan näin kirjoitti:

        void kysy_nimi()
        {
        char nimi[20]; /*tällä voi olla sama nimi*/
        printf("Anna nimi:");
        scanf("%s", nimi);
        return nimi[20];
        }

        juu ei tule pääohjelmalle oikeaa tietoa nimi-muuttujaan tuolla aliohjelmalla.

        MUTTA jos teen saman ihan suoraan pääohjelmassa näin:

        printf("Anna nimi:");
        scanf("%s", tuotenimi);
        printf("juuri luettu nimi %s\n", nimi);

        niin homma toimii.

        Selvitin vahingossa kokeilemalla miten tuon nimi-muuttujan sitten saa sinne tulosta funktioon. Toimii siis ainakin jos pääohjelmassa kysytään tuo nimi.

        //aliohjelman esittely
        void tulosta_tiedot(char nimi[20]);

        //aliohjelman kutsu
        tulosta_tiedot(nimi)

        //itse aliohjelma
        void tulosta_tiedot(char nimi[20])
        {
        printf("Annoit nimen: %s", nimi);
        }

        Mistäköhän tuo pitäisi tietää milloin käyttää pelkästään nimi ja millloin nimi[20]

        ps. miksi Dev-cpp ei monestikaan käännettäessä herjaa mitään vikaa., mutta ajettaessa kaatuu. Onkos se paska ohjelma?


      • Lauri.
        vaan näin kirjoitti:

        void kysy_nimi()
        {
        char nimi[20]; /*tällä voi olla sama nimi*/
        printf("Anna nimi:");
        scanf("%s", nimi);
        return nimi[20];
        }

        Funktiosi ei itseasiassa palauta kysymääsi merkkijonoa, vaan sen 20:n merkin. Siis vain yhden merkin. Tai jos oikein tarkkoja ollaan, niin ei edes sitä, koska taulukossa on 20 alkiota ja numerointi alkaa nollasta, niin 19 on viimeinen merkki, ja 20:s sitten vuotaa yli..

        Ensimmäisessä viestissä puolestaan koetit laittaa kysymääsi merkkijonoa 20:en alkioon, mutta palautit siis merkkijonon ihan oikein.

        Eli ota hakasulkeet pois kun palautat arvon, ja lisäksi laita se funktio palauttamaan joku arvo. Nyt funktio palauttaa voidin, eli ei mitään. Määritellään se palauttamaan merkkijonopointteri (tuossa tulee olla tähti).

        char* kysy_nimi()
        {
        char nimi[20]; /*tällä voi olla sama nimi*/
        printf("Anna nimi:");
        scanf("%s", nimi);
        return nimi;
        }

        Josta itseasiassa päästään vielä suurempiin ongelmiin, koska tuo osoittaa nyt tuon funktion sisällä olevaan muuttujaan, joka tuhoutuu saman tien kun funktion suoritus loppuu.

        Eli suosittelen, että teet tuosta nimi[20]:stä globaalin muuttujan, eli määrittelet sen funktioiden ulkopuolella, tyyliin:

        #include

        char nimi[20];

        void kysy_nimi() {
        printf("Anna nimi: ");
        scanf("%s", nimi);
        }

        void tulosta_nimi() {
        printf("%s", nimi);
        }

        int main(void) {
        kysy_nimi();
        tulosta_nimi();
        return 0;
        }

        Tuo esimerkki toimii ja kääntyy. Jos funktion todellakin pitää palauttaa jotain, niin sitten pääset hajoilemaan pointtereihin ja merkkijonoihin, joita ei kukaan ala opettamaan foorumeilla...


      • nuunuun
        vaan näin kirjoitti:

        void kysy_nimi()
        {
        char nimi[20]; /*tällä voi olla sama nimi*/
        printf("Anna nimi:");
        scanf("%s", nimi);
        return nimi[20];
        }

        #include

        void kysy_nimi(char *str); /* esittelyssä voi olla eri nimi muuttujalla kuin määrittelyssä */

        int main(void)
        {
        char nimi[2]; /* jee */
        kysy_nimi(nimi);
        printf("\nHei, %s.\n", nimi);
        return 0;
        }

        void kysy_nimi(char *nimi) /* arrayt[] on osoittimia. foo[3] on sama kuin (foo 2)* */
        {
        printf("Anna nimi:");
        scanf("%s", nimi); /* nimi on osoitin. &*nimi ja &(*nimi) on sama asia */
        }


      • PASKAA OLISIKO PAREMPAA TEK...
        oikeaa tietoa nimi-muuttujaan kirjoitti:

        juu ei tule pääohjelmalle oikeaa tietoa nimi-muuttujaan tuolla aliohjelmalla.

        MUTTA jos teen saman ihan suoraan pääohjelmassa näin:

        printf("Anna nimi:");
        scanf("%s", tuotenimi);
        printf("juuri luettu nimi %s\n", nimi);

        niin homma toimii.

        Selvitin vahingossa kokeilemalla miten tuon nimi-muuttujan sitten saa sinne tulosta funktioon. Toimii siis ainakin jos pääohjelmassa kysytään tuo nimi.

        //aliohjelman esittely
        void tulosta_tiedot(char nimi[20]);

        //aliohjelman kutsu
        tulosta_tiedot(nimi)

        //itse aliohjelma
        void tulosta_tiedot(char nimi[20])
        {
        printf("Annoit nimen: %s", nimi);
        }

        Mistäköhän tuo pitäisi tietää milloin käyttää pelkästään nimi ja millloin nimi[20]

        ps. miksi Dev-cpp ei monestikaan käännettäessä herjaa mitään vikaa., mutta ajettaessa kaatuu. Onkos se paska ohjelma?

        AJATELKAA KAKSI TUNTIA TÄLLAISTA PASKAA. OLISIKO EHKÄ PAREMPAAKIN TEKEMISTÄ.

        TYÖELÄMÄÄNKÖ TÄLLAISTA JA VIELÄ HANKALAMPAA TYHMEMPÄÄ TOUHUA IHMETTELEMÄÄN JA TIETOKONEEN RUUTUA TUIJOTTAMAAN, VOI VITTUJEN KEVÄT SAATANA.

        LÄHDEN SALILLE. PERKELE.


      • ei ei tajua
        nuunuun kirjoitti:

        #include

        void kysy_nimi(char *str); /* esittelyssä voi olla eri nimi muuttujalla kuin määrittelyssä */

        int main(void)
        {
        char nimi[2]; /* jee */
        kysy_nimi(nimi);
        printf("\nHei, %s.\n", nimi);
        return 0;
        }

        void kysy_nimi(char *nimi) /* arrayt[] on osoittimia. foo[3] on sama kuin (foo 2)* */
        {
        printf("Anna nimi:");
        scanf("%s", nimi); /* nimi on osoitin. &*nimi ja &(*nimi) on sama asia */
        }

        void kysy_nimi(char *nimi)
        {
        printf("Anna nimi:");
        scanf("%s", nimi); /* nimi on osoitin. &*nimi ja &(*nimi) on sama asia */
        }

        siis miksi nimi viedään parametrinä aliohjelmaan joka kysyy sitä nimeä? Vittu että on sekavaa.


      • 1213465
        ei ei tajua kirjoitti:

        void kysy_nimi(char *nimi)
        {
        printf("Anna nimi:");
        scanf("%s", nimi); /* nimi on osoitin. &*nimi ja &(*nimi) on sama asia */
        }

        siis miksi nimi viedään parametrinä aliohjelmaan joka kysyy sitä nimeä? Vittu että on sekavaa.

        jö. ^^. Palauta osotin. foo[] on foo[] ainoostaan määrittelyssä. Kunpahan yritin näyttää että merkkijonot on oikeasti ainoastaan jono peräkkäisiä kirjaimia joilla on yhteistä tekemistä sen verran että ne on peräkkäin. foo[] == foo, foo[0] == *foo, foo[1] == *(foo 1)


      • KonaniPrain
        PASKAA OLISIKO PAREMPAA TEK... kirjoitti:

        AJATELKAA KAKSI TUNTIA TÄLLAISTA PASKAA. OLISIKO EHKÄ PAREMPAAKIN TEKEMISTÄ.

        TYÖELÄMÄÄNKÖ TÄLLAISTA JA VIELÄ HANKALAMPAA TYHMEMPÄÄ TOUHUA IHMETTELEMÄÄN JA TIETOKONEEN RUUTUA TUIJOTTAMAAN, VOI VITTUJEN KEVÄT SAATANA.

        LÄHDEN SALILLE. PERKELE.

        Ethän vain ylirasita aivojasi salilla


      • vaan kroppaa
        KonaniPrain kirjoitti:

        Ethän vain ylirasita aivojasi salilla

        Huh huh että teki gutaa. Kunnon treeni taas vaihteksi, hölkkäämällä salille, sopivasti treeniä ja takaisin kevyesti hölkäten.

        Voittaa kevyesti haistvitun c:n ihmettelyn.
        No mutta mihis me jäätiin. Te cokispullojen kanssa pc:n ääressä istuvat kynäniskat/läskipallerit voitte nyt kertoa miten tuonne tulosta funktioon saadaan tuo nimi[20] muuttujan sisältö. //vitsi vitsi

        Kiitos.


      • juttuja joita ei koulussa o...
        nuunuun kirjoitti:

        #include

        void kysy_nimi(char *str); /* esittelyssä voi olla eri nimi muuttujalla kuin määrittelyssä */

        int main(void)
        {
        char nimi[2]; /* jee */
        kysy_nimi(nimi);
        printf("\nHei, %s.\n", nimi);
        return 0;
        }

        void kysy_nimi(char *nimi) /* arrayt[] on osoittimia. foo[3] on sama kuin (foo 2)* */
        {
        printf("Anna nimi:");
        scanf("%s", nimi); /* nimi on osoitin. &*nimi ja &(*nimi) on sama asia */
        }

        tässä on muuten itse asiassa aika helvetisti juttuja joita ei koulussa ole opetettu ja sanottu ettei näin saa tehdä.

        esimerkiksi:

        void kysy_nimi(char *str);
        ?Mitä tässä oikein tapahtuu? Viedään parametrinä pointteri?

        kysy_nimi(nimi);
        ? Miten parametrinä voidaan viedä asia jota kysytään? Miksi tuo on void, eikö palauta mitään?

        Kuten huomaatte perusasioissa ollaan menossa ja ihan pihalle näistä.

        Miten tuo tehtäisiin ihan perustyylillä,

        aliohjelma kysy joka palauttaa merkkijonon nimi ?


      • 62345432
        juttuja joita ei koulussa o... kirjoitti:

        tässä on muuten itse asiassa aika helvetisti juttuja joita ei koulussa ole opetettu ja sanottu ettei näin saa tehdä.

        esimerkiksi:

        void kysy_nimi(char *str);
        ?Mitä tässä oikein tapahtuu? Viedään parametrinä pointteri?

        kysy_nimi(nimi);
        ? Miten parametrinä voidaan viedä asia jota kysytään? Miksi tuo on void, eikö palauta mitään?

        Kuten huomaatte perusasioissa ollaan menossa ja ihan pihalle näistä.

        Miten tuo tehtäisiin ihan perustyylillä,

        aliohjelma kysy joka palauttaa merkkijonon nimi ?

        Tuo palauttaa... c:tä vai c ? En osaa c , mut c:ssä on normaalia pistää pointtereita argumentteina, ja niillä sit käsitellä funktion ulkopuolista stuffia (et voi palauttaa montaa arvoa). Pointteri itsessään siis ei sisällä tietoa, vaan se osoittaa muuttujaan. Array on peräkkäisiä muistipaikkoja varattuna tietyn tyyppiselle tiedolle, esimerkiksi char. Operaattorilla * sit käpistellään tietoa johon osoitin osoittaa (ja käytetään määrittelyssä). Operaattori & antaa muuttujan osoitteen.

        Konaniprainin esimerkki on hyvä, kannattaa katsoa siitä vaikkei se varsinaisesti palautakaan vaan käpistelee argumenttina annetun pointterin kautta funktion ulkopuolista tietoa.

        #include

        char* kysy_nimi(void);

        int main(void)
        {
        printf("\nHei, %s.\n", kysy_nimi());
        return 0;
        }

        char* kysy_nimi(void)
        {
        static char nimi[20];
        printf("Anna nimi:");
        scanf("%s", nimi);
        return nimi; /* nimi on osoitin koska nimi[20] on taulukko. Taulukko on peräkkäisiä muistipaikkoja, ja taulukon nimi on osoitin ensimmäiseen alkioon. nimi ja nimi-- toimisi ihan hyvin -- sen jälkeen taulukon nimi osoittaa seuraavaan tai edelliseen alkioon. */
        }


      • Sivullinen......
        juttuja joita ei koulussa o... kirjoitti:

        tässä on muuten itse asiassa aika helvetisti juttuja joita ei koulussa ole opetettu ja sanottu ettei näin saa tehdä.

        esimerkiksi:

        void kysy_nimi(char *str);
        ?Mitä tässä oikein tapahtuu? Viedään parametrinä pointteri?

        kysy_nimi(nimi);
        ? Miten parametrinä voidaan viedä asia jota kysytään? Miksi tuo on void, eikö palauta mitään?

        Kuten huomaatte perusasioissa ollaan menossa ja ihan pihalle näistä.

        Miten tuo tehtäisiin ihan perustyylillä,

        aliohjelma kysy joka palauttaa merkkijonon nimi ?

        """
        void kysy_nimi(char *str);
        ?Mitä tässä oikein tapahtuu? Viedään parametrinä pointteri?
        """

        Siinä ei viedä mitään, vaan yksinkertaisesti esitellään funktio, eli kerrotaan kääntäjälle, että tiedostosta löytyy funktio nimeltä "kysy_nimi" ja sille pitää antaa parametriksi pointteri.


        """
        kysy_nimi(nimi);
        ? Miten parametrinä voidaan viedä asia jota kysytään? Miksi tuo on void, eikö palauta mitään?
        """

        Tuossa vaiheessa kutsutaan funktiota ja sille annetaan parametriksi pointteri eli osoitin. Kysy_nimi -funktio tallentaa kyseisen osoittimen osoittamaan osoitteeseen kysymänsä nimen. Funktiolle siis kerrotaan parametrin avulla se, mihin osoitteeseen funktion tulee tallentaa käyttäjän syöttämä nimi.


        """
        Miten tuo tehtäisiin ihan perustyylillä,
        aliohjelma kysy joka palauttaa merkkijonon nimi ?
        """

        Tuo esimerkki oli täysin perustyyli, ja kaikki muu menee paljon hankalammaksi ja huonommaksi. Huomaathan, että lähes kaikki C kielen funktiot toimivat tuolla tyylillä. Eihän scanf "aliohjelmakaan" palauta mitään merkkijonoa, vaan sille kerrotaan parametrin avulla se osoite johon sen halutaan tallentavan merkkijono eli käyttäjän syöte, (näin myös tuon esimerkin kysy_nimi -aliohjelma toimii).


      • Sivullinen......
        juttuja joita ei koulussa o... kirjoitti:

        tässä on muuten itse asiassa aika helvetisti juttuja joita ei koulussa ole opetettu ja sanottu ettei näin saa tehdä.

        esimerkiksi:

        void kysy_nimi(char *str);
        ?Mitä tässä oikein tapahtuu? Viedään parametrinä pointteri?

        kysy_nimi(nimi);
        ? Miten parametrinä voidaan viedä asia jota kysytään? Miksi tuo on void, eikö palauta mitään?

        Kuten huomaatte perusasioissa ollaan menossa ja ihan pihalle näistä.

        Miten tuo tehtäisiin ihan perustyylillä,

        aliohjelma kysy joka palauttaa merkkijonon nimi ?

        Jos sen viestin esimerkkiä haluaisi jotenkin kehittää, niin ne olisivat lähinnä sellaiset asiat kuin, että funktiolle pitäisi pysytä kertomaan mikä on maksimi sallittu merkkien määrä, sekä funktion pitäisi palauttaa arvo joka kertoo onnistuiko luku vai ei, yms. Mitä koulussa on kielletty tekemästä?


      • minkä takia tehdään funktio...
        Lauri. kirjoitti:

        Funktiosi ei itseasiassa palauta kysymääsi merkkijonoa, vaan sen 20:n merkin. Siis vain yhden merkin. Tai jos oikein tarkkoja ollaan, niin ei edes sitä, koska taulukossa on 20 alkiota ja numerointi alkaa nollasta, niin 19 on viimeinen merkki, ja 20:s sitten vuotaa yli..

        Ensimmäisessä viestissä puolestaan koetit laittaa kysymääsi merkkijonoa 20:en alkioon, mutta palautit siis merkkijonon ihan oikein.

        Eli ota hakasulkeet pois kun palautat arvon, ja lisäksi laita se funktio palauttamaan joku arvo. Nyt funktio palauttaa voidin, eli ei mitään. Määritellään se palauttamaan merkkijonopointteri (tuossa tulee olla tähti).

        char* kysy_nimi()
        {
        char nimi[20]; /*tällä voi olla sama nimi*/
        printf("Anna nimi:");
        scanf("%s", nimi);
        return nimi;
        }

        Josta itseasiassa päästään vielä suurempiin ongelmiin, koska tuo osoittaa nyt tuon funktion sisällä olevaan muuttujaan, joka tuhoutuu saman tien kun funktion suoritus loppuu.

        Eli suosittelen, että teet tuosta nimi[20]:stä globaalin muuttujan, eli määrittelet sen funktioiden ulkopuolella, tyyliin:

        #include

        char nimi[20];

        void kysy_nimi() {
        printf("Anna nimi: ");
        scanf("%s", nimi);
        }

        void tulosta_nimi() {
        printf("%s", nimi);
        }

        int main(void) {
        kysy_nimi();
        tulosta_nimi();
        return 0;
        }

        Tuo esimerkki toimii ja kääntyy. Jos funktion todellakin pitää palauttaa jotain, niin sitten pääset hajoilemaan pointtereihin ja merkkijonoihin, joita ei kukaan ala opettamaan foorumeilla...

        KIITOS tuo ratkaisi jutun.

        koko ajan olen vääntänyt ja yrittänyt tehdä funkitiota joka palauttaa tuon nimen.

        Miksi ihmeessä, jos kerta tuon voi tehdä noinkin. Mitä hyötyä sitten on funktioista jotka palauttaa arvon, jos sen voi noinkin helposti tehdä muutoinkin.

        Onko jotain merkittävää haittaa noista globaaleista muuttujista? Sulautetussa taitaa olla jotain merkitystä?

        KIITOS VIELÄ KERRAN.


      • Lauri.
        minkä takia tehdään funktio... kirjoitti:

        KIITOS tuo ratkaisi jutun.

        koko ajan olen vääntänyt ja yrittänyt tehdä funkitiota joka palauttaa tuon nimen.

        Miksi ihmeessä, jos kerta tuon voi tehdä noinkin. Mitä hyötyä sitten on funktioista jotka palauttaa arvon, jos sen voi noinkin helposti tehdä muutoinkin.

        Onko jotain merkittävää haittaa noista globaaleista muuttujista? Sulautetussa taitaa olla jotain merkitystä?

        KIITOS VIELÄ KERRAN.

        >> Miksi ihmeessä, jos kerta tuon voi tehdä noinkin. Mitä hyötyä sitten on funktioista jotka palauttaa arvon, jos sen voi noinkin helposti tehdä muutoinkin.

        Koska aina tuo ei ole mahdollista. Joskus saatat käyttää jotain valmista kirjastoa joka hoitaa nimen kyselyn, joten arvojen heittely on tavallaan "pakollista". Toisekseen, mitä enemmän globaaleja muuttujia sinulla on, sitä tuskallisempaa on selvittää koodin toimintaa. Ylläpidettävyys siis kärsii. Geneerisyydestä nyt puhumattakaan! Nyt tuota funktiota voi käyttää tasan yhteen asiaan. Jos haluat joskus kysyä nimeä toiselle muuttujalle, niin sepä ei onnistu...

        >> Onko jotain merkittävää haittaa noista globaaleista muuttujista? Sulautetussa taitaa olla jotain merkitystä?

        Sulautetuissa saatetaan esitellä muuttujia globaaleiksi joko siksi, ettei ole paljoa muistia, sekä siksi, ettei noita tarvitse alkaa venkslaamaan edes takaisin (säästää siis aikaa).

        Normi funktiokutsu laittaa ensin pinoon nykyisen sijainnin. Sitten pinoon laitetaan parametrit käänteisessä järjestyksessä. Funktiossa sitten luetaan parametrit, suoritetaan funktio ja lopuksi vielä poistetaan parametrit pinosta. Joskus tähän ei ole resursseja, joten muuttujista tehdään globaaleja. Enempää tuosta en taida osata sanoa, koska vain kerran olen tehnyt koodia sulautettuun järjestelmään, ja silloin muisti ei ollut rajoite.

        Tiivistettynä siis:
        Globaaleista muuttujista ei ole haittaa, mutta niiden käyttämättä jättämisestä on hyötyä.


      • Balle Ramstedt
        minkä takia tehdään funktio... kirjoitti:

        KIITOS tuo ratkaisi jutun.

        koko ajan olen vääntänyt ja yrittänyt tehdä funkitiota joka palauttaa tuon nimen.

        Miksi ihmeessä, jos kerta tuon voi tehdä noinkin. Mitä hyötyä sitten on funktioista jotka palauttaa arvon, jos sen voi noinkin helposti tehdä muutoinkin.

        Onko jotain merkittävää haittaa noista globaaleista muuttujista? Sulautetussa taitaa olla jotain merkitystä?

        KIITOS VIELÄ KERRAN.

        Jos ihan oikeasti aikoo tehdä komentoriviohjelman, niin kannattaa käyttää valmista kirjastoa esim. GNU Readline Library http://www.cs.utah.edu/dept/old/texinfo/bash/rlman_toc.html , jossa on valmiina tarvittavat funktiot ynnä muuta.

        Homma menisi näin simppelisti tuolla kirjastolla:

        #include
        #include
        #include
        #include

        int main ()
        {
           
           char *line;

           line = readline ("Kirjoita jotain: ");
           printf ("Kirjoitit: %s\n", line);
           
           free(line);

           return 0;

        }


      • /*saman asian ajaa*/

        nimi[0]=kysy_nimi(); /*tietenkin silla edellytyksell, etta nimi on ennen aliohjelman kutsua varattu siten, että nimi: n mahtuu merkkejä 1 kysy_nimi(): n pituus eli tilaa jää vielä yhdelle NULL: ille tai enemmän. Jos jää vähemmän, tulee ajonaikaisia virheitä, mikäli ohjelma on laadittu siten, että virheenkäsittelijä juuri tuollaiselle tai yleismalliselle ajonaikaiselle virheelle. Mikäli näin ei ole, ohjelma kaatuu, jos tilaa on varattu nimi: lle vähemmän kuin edellä kerrottiin. */


      • ainakaan minun koodissa
        /*saman asian ajaa*/ kirjoitti:

        nimi[0]=kysy_nimi(); /*tietenkin silla edellytyksell, etta nimi on ennen aliohjelman kutsua varattu siten, että nimi: n mahtuu merkkejä 1 kysy_nimi(): n pituus eli tilaa jää vielä yhdelle NULL: ille tai enemmän. Jos jää vähemmän, tulee ajonaikaisia virheitä, mikäli ohjelma on laadittu siten, että virheenkäsittelijä juuri tuollaiselle tai yleismalliselle ajonaikaiselle virheelle. Mikäli näin ei ole, ohjelma kaatuu, jos tilaa on varattu nimi: lle vähemmän kuin edellä kerrottiin. */

        eli kokeilin ja itse asiassahan tuohan se koko ongelma on ollutkin

        muuttujana char nimi[20] globaalina tai paikallisena vai mikä se oli kuitenkin pääohjelmassa

        pääohjelmassa nimi[20]=kysy_nimi();

        tulos: ei edes käänny ELLEI tee kysy_nimi -funktiosta palauttavaa. SItten siitä päästään siihen, että kun sen jälkeen yritin tulostaa tuon nimi-muuttujan sisällön, niin se ei tulostunut sellaisena kuin sen sisällön luulisi olevan.

        En tiedä sitten miten sinä sen tekisit. Jos voit laittaa koko koodin niin olisi hyvä. Joku yksinkertainen ajatusvirhe minulla on tuossa pakko olla...


      • kommentoidut käyttöön niin ...
        ainakaan minun koodissa kirjoitti:

        eli kokeilin ja itse asiassahan tuohan se koko ongelma on ollutkin

        muuttujana char nimi[20] globaalina tai paikallisena vai mikä se oli kuitenkin pääohjelmassa

        pääohjelmassa nimi[20]=kysy_nimi();

        tulos: ei edes käänny ELLEI tee kysy_nimi -funktiosta palauttavaa. SItten siitä päästään siihen, että kun sen jälkeen yritin tulostaa tuon nimi-muuttujan sisällön, niin se ei tulostunut sellaisena kuin sen sisällön luulisi olevan.

        En tiedä sitten miten sinä sen tekisit. Jos voit laittaa koko koodin niin olisi hyvä. Joku yksinkertainen ajatusvirhe minulla on tuossa pakko olla...

        //Otsikkotiedostot
        #include
        #include



        //void kysy_nimi();
        char kysy_nimi();
        void tulosta (char nimi[20]);


        char nimi[20]; //globaali muuttuja


        int main (void)
        {

        nimi[20]=kysy_nimi();
        //kysy_nimi();
        tulosta(nimi);
        getche();
        }
        /*
        void kysy_nimi()
        {
        printf("Anna nimi: ");
        scanf("%s", nimi);
        }
        */

        char kysy_nimi()
        {
        char bnimi[20];
        printf("Anna nimi: ");
        scanf("%s", bnimi);
        return bnimi[20];
        }

        void tulosta (char nimi[20])
        {
        printf("Annoit nimen: %s\n", nimi); //tulostetaan muuttujan sisältö
           
        }


      • mut toivottavasti.
        kommentoidut käyttöön niin ... kirjoitti:

        //Otsikkotiedostot
        #include
        #include



        //void kysy_nimi();
        char kysy_nimi();
        void tulosta (char nimi[20]);


        char nimi[20]; //globaali muuttuja


        int main (void)
        {

        nimi[20]=kysy_nimi();
        //kysy_nimi();
        tulosta(nimi);
        getche();
        }
        /*
        void kysy_nimi()
        {
        printf("Anna nimi: ");
        scanf("%s", nimi);
        }
        */

        char kysy_nimi()
        {
        char bnimi[20];
        printf("Anna nimi: ");
        scanf("%s", bnimi);
        return bnimi[20];
        }

        void tulosta (char nimi[20])
        {
        printf("Annoit nimen: %s\n", nimi); //tulostetaan muuttujan sisältö
           
        }

        En tiedä vastaako tuo siihen mitä haluat tietää, mut toivottavasti.


        #include
        //#include /* http://en.wikipedia.org/wiki/Conio.h */

        // esittelyt -- // kommentit on c99.
        char* kysy_nimi(); /* huomaa * */
        void tulosta (char nimi[]); /* char *nimi kävis kanssa */

        char nimi[20]; // nämä on kaiken pahan alku ja juuri

        int main (void)
        {
           char *cp;

           cp=kysy_nimi(); /* kysy_nimi kertoo missä nimi on */
           tulosta(cp);
           tulosta(nimi);
           
           kysy_nimi(); /* Voidaan olla välittämättä paluuarvosta */
           tulosta(cp); /* cp osoittaa edelleen samaan paikkaan */
           tulosta(nimi);

           //getche();
           return 0;
        }

        char* kysy_nimi() /* taulukko on muistialue joka sisältää monta muuttujaa.
               Voidaan palauttaa vain yksi, eli siis osoitin muistialueen
               alkuun. Osoitin */
        {
           char bnimi[20]; /* tämä katoaa kun funktiota on kutsuttu, eikä kaikkia
                  20 muuttujaa voida palauttaa. Voisit kait pistää
                  siihen staticin jos haluisit ton globaalin pois.
                  Staticilla on eri merkitys funktiossa ja funktion
                  ulkopuolella.
        http://publications.gbdirect.co.uk/c_book/chapter8/declarations_and_definitions.html
                  */
           printf("Anna nimi: ");
           scanf("%s", nimi);
           return nimi; /* Nimi on pointteri. On se. */
        }

        void tulosta (char nimi[]) /* *nimi tässä on sama kuin nimi[] */
        {
           printf("Annoit nimen: %s\n", nimi); //tulostetaan muuttujan sisältö
        }


      • Nero Burner
        mut toivottavasti. kirjoitti:

        En tiedä vastaako tuo siihen mitä haluat tietää, mut toivottavasti.


        #include
        //#include /* http://en.wikipedia.org/wiki/Conio.h */

        // esittelyt -- // kommentit on c99.
        char* kysy_nimi(); /* huomaa * */
        void tulosta (char nimi[]); /* char *nimi kävis kanssa */

        char nimi[20]; // nämä on kaiken pahan alku ja juuri

        int main (void)
        {
           char *cp;

           cp=kysy_nimi(); /* kysy_nimi kertoo missä nimi on */
           tulosta(cp);
           tulosta(nimi);
           
           kysy_nimi(); /* Voidaan olla välittämättä paluuarvosta */
           tulosta(cp); /* cp osoittaa edelleen samaan paikkaan */
           tulosta(nimi);

           //getche();
           return 0;
        }

        char* kysy_nimi() /* taulukko on muistialue joka sisältää monta muuttujaa.
               Voidaan palauttaa vain yksi, eli siis osoitin muistialueen
               alkuun. Osoitin */
        {
           char bnimi[20]; /* tämä katoaa kun funktiota on kutsuttu, eikä kaikkia
                  20 muuttujaa voida palauttaa. Voisit kait pistää
                  siihen staticin jos haluisit ton globaalin pois.
                  Staticilla on eri merkitys funktiossa ja funktion
                  ulkopuolella.
        http://publications.gbdirect.co.uk/c_book/chapter8/declarations_and_definitions.html
                  */
           printf("Anna nimi: ");
           scanf("%s", nimi);
           return nimi; /* Nimi on pointteri. On se. */
        }

        void tulosta (char nimi[]) /* *nimi tässä on sama kuin nimi[] */
        {
           printf("Annoit nimen: %s\n", nimi); //tulostetaan muuttujan sisältö
        }

        new, *, ->, ,
        niin tuollaiset pähkäilyt ja ohjelmarivihirviöt pienenevät murto-osiinsa ainakin näissä triviaalitapauksissa. Nuo ovat c : aa. Kannattaa myös ensin tarkistaa vaikkapa Internetistä, onko kukaan toinen jo kirjoittanut c: llä taikka jollain muulla kielellä ratkaisun juuri siihen ongelmaan, joka juuri teille ilmeni. Ja nykyään, kun kukaan ei oikeita kirjoja lue, kirjastosta saa c- ja c -raamattuja ilman että joutuu vuosikausia niitä jonottamaan: niissä on vuosikymmeniä sitten ratkaistu kaikki ohjelmointiongelmat, mutta kannattaa varoa todella huonoja suomennoksia.


      • kiiiiiitooooos
        PASKAA OLISIKO PAREMPAA TEK... kirjoitti:

        AJATELKAA KAKSI TUNTIA TÄLLAISTA PASKAA. OLISIKO EHKÄ PAREMPAAKIN TEKEMISTÄ.

        TYÖELÄMÄÄNKÖ TÄLLAISTA JA VIELÄ HANKALAMPAA TYHMEMPÄÄ TOUHUA IHMETTELEMÄÄN JA TIETOKONEEN RUUTUA TUIJOTTAMAAN, VOI VITTUJEN KEVÄT SAATANA.

        LÄHDEN SALILLE. PERKELE.

        tuli helvetin hyvät naurut :) Toi on oikeata meininkiä, salille vaan purkamaan raivoa, jos ei onnistu perkele.


      • kyllä fyysinen rasitus para...
        kiiiiiitooooos kirjoitti:

        tuli helvetin hyvät naurut :) Toi on oikeata meininkiä, salille vaan purkamaan raivoa, jos ei onnistu perkele.

        olepa hyvä.

        Kyllä se fyysinen rasitus parantaa pahemmakin ahdistuksen. Suosittelen kaikkia kokeilemaan.

        ps. fyysinen työkin on muuten paljon paljon kivempaa...


    • KonaniPrain

      #include

      #define MAX_NIMI_PITUUS 20

      char nimi[MAX_NIMI_PITUUS] = {0};

      void kysy_nimi(char *str)
      {
         printf("Anna nimi: ");
         scanf("%s", str, MAX_NIMI_PITUUS-1);
      }

      void tulosta_nimi(const char *str)
      {
         if (str) // if (str != NULL)
         {
            printf("Nimesi on: %s\n", str);
         }
      }

      int main(int argc, char * argv[])
      {
         kysy_nimi(nimi);
         tulosta_nimi(nimi);

         return 0;
      }

    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Katso: Ohhoh! Miina Äkkijyrkkä sai käskyn lähteä pois Farmi-kuvauksista -Kommentoi asiaa: "En ole.."

      Tämä oli shokkiyllätys. Oliko tässä kyse tosiaan siitä, että Äkkijyrkkä sanoi asioita suoraan vai mistä.... Tsemppiä, Mi
      Tv-sarjat
      130
      4955
    2. Voi kun mies rapsuttaisit mua sieltä

      Saisit myös sormiisi ihanan tuoksukasta rakkauden mahlaa.👄
      Ikävä
      31
      3134
    3. Haluan jutella kanssasi Nainen

      Olisiko jo aika tavata ja avata tunteemme...On niin paljon asioita joihin molemmat ehkä haluaisimme saada vastaukset...O
      Ikävä
      16
      1807
    4. Poliisiauto Omasp:n edessä parkissa

      Poliisiauto oli parkissa monta tuntia Seinäjoen konttorin edessä tänään. Haettiinko joku tai jotain pankista tutkittavak
      Seinäjoki
      22
      1760
    5. Onko mies niin,

      että sinulle ei riitä yksi nainen? Minulle suhde tarkoittaa sitoutumista, tosin eihän se vankila saa olla kummallekaan.
      Tunteet
      19
      1625
    6. Voitasko leikkiä jotain tunnisteleikkiä?

      Tietäisi ketä täällä käy kaipaamassa.. kerro jotain mikä liittyy sinuun ja häneen eikä muut tiedä. Vastaan itsekin kohta
      Ikävä
      71
      1491
    7. Miksi näin?

      Miksi vihervassut haluaa maahan porukkaa jonka pyhä kirja kieltää sopeutumisen vääräuskoisten keskuuteen? Näin kotoutumi
      Maailman menoa
      19
      1247
    8. Armi Aavikko Malmin hautausmaa

      Haudattiinko Armi arkussa Malmin hautausmaalle vai tuhkattiinko hänet? Kuka tietää asiasta oikein?
      Kotimaiset julkkisjuorut
      10
      1243
    9. Haluisin suudella ja huokailla

      ja purra kaulaasi ja rakastella sinua. Haluisin puristella rintojasi ja pakaroitasi. Ei sinulla taida olla kuitenkaan ni
      Ikävä
      16
      1217
    10. Ison Omenan uhri tukahdutettiin kuoliaaksi. Kuolinsyynä sydämen pysähdys.

      Eli naisen hengittäminen estettiin ja tästä oli suorana seurauksena sydämen pysähdys. Ihan oppikirjan mukainen tapaus. H
      Maailman menoa
      17
      1207
    Aihe