Zliczanie znaków w ciągu

2012-11-05 22:32
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();
}

Pozostało 580 znaków

2012-11-05 22:41

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.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2012-11-05 23:04
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.

Pozostało 580 znaków

2012-11-05 23:12
Rev
1

std::getline


Pozostało 580 znaków

2012-11-05 23:19
0

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

Pozostało 580 znaków

2012-11-05 23:35
0

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


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2012-11-05 23:41
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.

edytowany 1x, ostatnio: paradise123, 2012-11-05 23:42

Pozostało 580 znaków

2012-11-05 23:45
0

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

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


"(...) otherwise, the behavior is undefined".

Pozostało 580 znaków

2012-11-05 23:51
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.

Zagraj mu hymn państwowy to wstanie ;D - Sarrus 2012-11-06 08:35

Pozostało 580 znaków

2012-11-05 23:58
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.


"(...) otherwise, the behavior is undefined".
edytowany 1x, ostatnio: Endrju, 2012-11-05 23:58

Pozostało 580 znaków

2012-11-06 00:09
0

Ech, fakt, zapomniałem usunąć ten warunek po wstawieniu get.line(). Oczy mnie pieką i robię głupie błędy.
W każdym razie, dzięki. Wszystko już jest w porządku. Wygląda na to, że muszę więcej popracować z tą klasą, bo sam sobie dołki kopię.

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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