Zliczanie znaków w ciągu

0

Dlaczego ten program nie liczy spacji i znaków po niej występujących?

#include <iostream>
#include <conio.h>
#include <string.h>
using namespace std;

int main()
{
    const int rozmiar=200;
    char tekst[rozmiar];

    int duze_litery=0, male_litery=0, cyfry=0, spacje=0, inne_znaki=0;

    cout << "Wprowadz tekst i zakoncz go znakiem \"*\": ";
    cin >> tekst;

    for(int i=0; i<strlen(tekst); i++)
    {
        if(tekst[i]=='*') break;

        if(tekst[i]>64 && tekst[i]<91)  duze_litery++;
        else
        {
            if(tekst[i]>60 && tekst[i]<123) male_litery++;
            else
            {
                if(tekst[i]==32) spacje++;
                else
                {
                    if(tekst[i]>47 && tekst[i]<58)cyfry++;
                    else
                    {
                        inne_znaki++;
                    }   
                }   
            }
        }

    }

    cout << "\n\nDuze litery: " << duze_litery <<"\n"; 
    cout << "Male litery: " << male_litery << "\n";
    cout << "Cyfry: " << cyfry << "\n";
    cout << "Spacje: " << spacje << "\n";
    cout << "Inne znaki: " << inne_znaki;

    getche();
}
2

Ponieważ cin >> tekst; wczyta jedno słowo do spacji, tabulacji lub entera. Poza tym jest to bardzo niebezpieczna praktyka ponieważ użytkownik może wprowadzić ponad 200 znaków bez jedynej spacji wtedy nastąpi mazanie po pamięci.

0

Istnieje jakieś inne rozwiązanie tego problemu poza wykorzystaniem pętli z dodatkową zmienną typu char i funkcją getch() ? Zależałoby mi na tym, by widzieć wpisywany tekst, a wspomniana funkcja tego mi nie zapewnia.

1

std::getline

0

Faktycznie. To załatwia wszystko, dzięki.

0

Nie wszytko:
if(tekst[i]>60 && tekst[i]<123) male_litery++; // tu jest źle.

0

Rzeczywiście, zdarza mi się jeszcze mylić kolumny ASCII :)

W sumie mam jeszcze jeden problem. Jak teraz przelecieć, po wszystkich znakach utworzonego stringa


    string tekst;
    cout << "Wprowadz tekst i zakoncz go znakiem \"*\": ";
    getline(cin, tekst, '*');

? Bo chyba nie mogę już odnieść się do niego jak do tablicy.

0

Bo chyba nie mogę już odnieść się do niego jak do tablicy.

Dlaczego nie? Możesz. Jest nawet operator[].

0
#include <iostream>
#include <conio.h>
#include <string.h>
using namespace std;

int main()
{
    string tekst;

    int duze_litery=0, male_litery=0, cyfry=0, spacje=0, inne_znaki=0;

    cout << "Wprowadz tekst i zakoncz go znakiem \"*\": ";
    getline(cin, tekst, '*');

    for(int i=0; ; i++)
    {
        if(tekst[i]=='*') break;

        if(tekst[i]>64 && tekst[i]<91)  duze_litery++;
        else
        {
            if(tekst[i]>97 && tekst[i]<123) male_litery++;
            else
            {
                if(tekst[i]==32) spacje++;
                else
                {
                    if(tekst[i]>47 && tekst[i]<58)cyfry++;
                    else
                    {
                        inne_znaki++;
                    }   
                }   
            }
        }

    }

    cout << "\n\nDuze litery: " << duze_litery <<"\n"; 
    cout << "Male litery: " << male_litery << "\n";
    cout << "Cyfry: " << cyfry << "\n";
    cout << "Spacje: " << spacje << "\n";
    cout << "Inne znaki: " << inne_znaki;

    getche();
}

Po wpisaniu ciągu i zakończeniu go podanym znakiem, program mi siada.

2

Ta pętla jest jakaś dziwaczna. Przede wszystkim znaku * nie będzie w tym tekście. Po drugie znasz przecież jego długość (std::string::length()), więc liczba iteracji jest z góry określona. Zamiast takich warunków, które zawierają magic numbers, możesz użyć funkcji z ccttype.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0