Jump to content
  • 0

pomoc C - Počítanie znakov (miniprogram)


Pickleboy

Dotaz

Pekny den, vytvoril som si jeden miniprogram, ktoreho ulohou je pocitat znaky vstupu. Pouzil som materialy z literatur jazyka C.

 

Co som urobil bolo, ze som si vytvoril premennu typu long, ktoru som pomenoval pz pre pocitanie znakov a nasledne som jej hodnotu nastavil na 0. Potom som pomocou cyklu while zistil, ci dane znaky v premmenej nie su indikatormi konca suboru (EOF) a ak nie, tak sa premmenej na pocitanie znakov mala hodnota zvysit o jednotku a nasledne jej hodnotu vypisat ako cele cislo typu long.

 

Problemom teda ale je, ze po napisani akehokolvek znaku do konzole mi nevypise jeho pocet znakov.

#include <stdio.h>

int main()
{
	long pz;
	pz = 0;
	while(getchar() != EOF)
	++pz;
	printf("%ld\n", pz);
}

Za kazdu pomoc s vysvetlenim problematiky vam budem velice vdacny.

Link to comment
Share on other sites

12 odpovědí na tuto otázku

Recommended Posts

  • 0
  • Globální moderátor
Problemom teda ale je, ze po napisani akehokolvek znaku do konzole mi nevypise jeho pocet znakov.

 

 

 

Tak EOF vyvoláš v konzoli jedině CTRL + D na unixech nebo na windowsu CTRL + Z. Pokud chceš aby ti vypsal počet znaků pokaždé když nějaký znak napíšeš, tak se to dělá trochu jinak

Link to comment
Share on other sites

  • 0

Takze vlastne vypisat hodnotu EOF nie je mozne?

 

Prikaz CTRL + Z v konzoli naozaj zafungoval, lebo ak teda indikatorom bol koniec suboru, tak sa cyklus ukoncil a tym padom aj main, cize cely program. Otazne teda ale je, akym postupom vytvorit program, ktory by dokazal pocitat mnou zadane znaky a vyhodit mi ich hodnotu ako vystup na novom riadku.

Link to comment
Share on other sites

  • 0
  • Globální moderátor

Tým pádom stačí spraviť niečo nasledovné: 

while(getchar() != EOF)
{
    ++pz;
    printf("%ld\n", pz);
}

Cyklus sa teda bude vykonávať až dovtedy kým nezadáš EOF char, a pri každom jednom zadanom znaku, pripočíta 1 ku pz a vypíše momentálny počet znakov

Link to comment
Share on other sites

  • 0

To co ti povedal highprint je, ze z konzoly nikdy nedostanes EOF.

"Takze vlastne vypisat hodnotu EOF nie je mozne"
wtf bro, proste eof dostaneš v konzoli až ked vypneš dany program.

Pri suboroch by to fungovat mohlo, ale nie v konzoli.
Detekovat chces ci nestlacil enter, atd.

Link to comment
Share on other sites

  • 0

Samozrejme, ze takto som to skusal. Problem som teda vyriesil tym, ze som dal operacie pod cyklus do zlozenych zatvoriek, avsak aj napriek tomu nefungoval tak, ako som chcel.

 

Ked teda dajme tomu pouzijem zapis od UAreBugged, tak mi skutocne ulozi a vypise vsetky znaky, ktore som zadal, ale vypise mi ich pod seba. Ja vsak potrebujem to, ze ked napisem nejake slovo, tak mi zrata pocet jeho znakov a vypise jedno cislo, ktore bude teda davat danu hodnotu znakov toho slova.

 

Dufam ze som to vysvetlil pochopitelne, v celej tejto veci som este zatial novacik, teda neovladam odborne vyrazy, ktore by popisovali to, co chcem dosiahnut.

 

AKTUALNE (ZLE): -

ahoj

1
2
3
4
5

AKO TO CHCEM:

ahoj
4

Jeden znak, ten piaty teda cini ten novy riadok, no aj ked som ten novy riadok odstranil, tak mi to vypisao jednotlive hodnoty pod seba.

Edited by Pickleboy
Link to comment
Share on other sites

  • 0

Presne tak, ono moja pociatocna mienka pouzitia toho cyklusu bola asi taka, aby sa tento proces nasledne zopakoval. Teda keby som zadal slovo, vypisalo pocet jeho znakov, tak by som mohol zadat slovo dalsie. Asi som sa v tom ale trosku stratil.

Link to comment
Share on other sites

  • 0
  • Globální moderátor

tak teda môžeš spraviť niečo takéto 

while(true)
{
    string slovo; //definujeme si string premennu slovo
    getline(cin, slovo); //ziskame text input a ulozime ho do premennej slovo
    int dlzkaSlova = slovo.length(); //ulozime do int premennej dlzkaSlova pocet znakov slova
    printf ("Dlzka slova: %d \n", dlzkaSlova); //vypiseme dlzku slova
}

Momentálne je to nekonečný cyklus ale dá sa to ľahko upraviť.

 

V tomto príklade počítame samozrejme s tým že si includol string a iostream a že namespace máme nastavený ako std

#include <iostream>
#include <string>
using namespace std;
  • Líbí se mi to! (+1) 1
Link to comment
Share on other sites

  • 0

Hore mas uvedenu C++ verziu, dolozim C:

 


#include <stdio.h>
#include <string.h>

int main(void) {
    
    // NOTE(ZaKlaus): Ziskaj retazec (volitelne si mozes spravit dynamicke pole.)
    char buf[128] = {0};
    fgets(buf, sizeof(buf), stdin);
    
    // NOTE(ZaKlaus): dlzka retazca - 1 (1 znak je whitespace)
    fprintf(stdout, "Pocet znakov: %lu\n", strlen(buf)-1); 
    
    return 0;
}

 

Tu je dalsia podoba tentokrat s dynamickym polom:


#include <stdio.h>
#include <string.h>

int main(void) {
    
    // NOTE(ZaKlaus): Alternativna verzia (blizsia std::string)
    
    char *str = malloc(1);
    size_t len = 0;
    {
        char c;
        
        // NOTE(ZaKlaus): Citame znaky kym nedojdeme k whitespace
        while((c = getchar()) != '\n') {
            str = realloc(str, ++len);
            str[len-1] = c;
        }
        
        // NOTE(ZaKlaus): Retazec je potrebne ukoncit
        str[len] = '\0';
        
        // NOTE(ZaKlaus): Tentokrat sa sem whitespace nedostal, (pripadne vypis 'len-1', avsak chcel som zachovat strukturu prikladu)
        fprintf(stdout, "Pocet znakov: %lu\n", strlen(str));
    }
    free(str);
    
    return 0;
}

Edited by ZaKlaus
Link to comment
Share on other sites

  • 0

ZaKlaus, nebolo by lepšie počítať znaky rovno vo while cykle? Myslím, že tu je zbytočné obsah stdinu ukladať do nejakej premennej, vzhľadom na to, že nás zaujíma iba počet znakov. Možno by si sa tak vyhol dynamickej alokácii a realokácii v každej iterácii.
 

#include <stdio.h>

int main(int argc, char *argv[])
{
    unsigned int len = 0;
    while (getchar() != '\n')
        len++;

    printf("%u\n", len);
    return 0;
}

// EDIT: Neviem čítať ďalšie príspevky

 

Čo sa týka toho opakovania úlohy, môžeš si spraviť nekonečný cyklus, napríklad:

#include <stdio.h>

int main(int argc, char *argv[])
{
    while (1) {
        unsigned int len = 0;
        while (getchar() != '\n')
            len++;

        printf("%u\n", len);
    }
}

 

Edited by DuFF
  • Líbí se mi to! (+1) 1
Link to comment
Share on other sites

  • 0

 

ZaKlaus, nebolo by lepšie počítať znaky rovno vo while cykle? Myslím, že tu je zbytočné obsah stdinu ukladať do nejakej premennej, vzhľadom na to, že nás zaujíma iba počet znakov. Možno by si sa tak vyhol dynamickej alokácii a realokácii v každej iterácii.

 

#include <stdio.h>

int main(int argc, char *argv[])
{
    unsigned int len = 0;
    while (getchar() != '\n')
        len++;

    printf("%u\n", len);
    return 0;
}

 

Hej, mas pravdu,

DuFF++;

 

EDIT:

Ak by mu trebalo retazec, tak idealne by mohol realokovat po chunkoch kazdu X-tu iteraciu, pripadne to ulozit do zasobnika (ak ratame s limitom velkosti vstupu) a nasledne prekopirovat do dynamickeho pola.

Edited by ZaKlaus
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...