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.

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ę.

0

Zawsze możesz jeszcze zrezygnować z jawnej pętli i użyć count_if oraz, wspomnianego przez Endju, nagłówka cctype.

size_t digit_count = count_if(line.begin(), line.end(), isdigit);

http://en.cppreference.com/w/c/string/byte

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