Wpisanie tekstu w konsoli i wyświetlenie ilości znaków tego tekstu

0

Chce napisać taki program:
Program podaje komunikat Podaj tekst.
Ja w konsoli wpisuje tekst
Program podaje ilość znaków w konsoli.

Napisałam kod ale on nie działa. Proszę o pomoc - początkująca. Z góry dzięki.

cout << "Podaj tekst " << endl;
char wyraz[] = cin;
cin >> wyraz;
cout << strlen(wyraz) << endl;
0

Zobacz sobie na string http://www.cplusplus.com/reference/string/string/ Długość sprawdzisz metodą length()

0
szweszwe napisał(a):

Zobacz sobie na string http://www.cplusplus.com/reference/string/string/ Długość sprawdzisz metodą length()

Za pomocą string program sam mi wypisze tekst, a mi nie o to chodzi. Ja chce sama pisać tekst już w otwartej konsoli po tym jak program wypisze mi tekst Podaj tekst. a po napisaniu i kliknięciu np klawisza enter program pokaże mi ile ten tekst ma znaków. Proszę o pomoc bo nadal nie wiem jak to zrobić.

0
szweszwe napisał(a):

Zobacz sobie na string http://www.cplusplus.com/reference/string/string/ Długość sprawdzisz metodą length()

Udało mi się napisać program, który po wpisaniu tekstu w konsoli wyświetla mi liczbę znaków, ale wyświetla mi tą liczbę nie poprawnie np. wpisze tekst Marta Długa tomi pokazuje że jest 6 znaków, a powinno pokazać 10. Marta ma 5 znaków i Długa ma 5 znaków. Proszę o pomoc.

Nie wiem jak zrobić kolorową składnie.`

#include <iostream>
#include <string>
using namespace std;
int main()
{
	system("chcp 1250");
	system("cls");

	string tekst;
	cout << "Podaj tekst ";
	cin >> tekst;
	getline(cin, tekst);
	cout << "Tekst ma znaków " << tekst.length() << endl;
	
	system("pause");
	return 0;
}
1

Użyj funkcji std::getline(). Operator >> pobiera jeden wyraz, jeden ciąg do najbliższego białego znaku.
Pobrany tekst funkcją getline (Marta Dluga) będzie miał długość 11, bo spacja to też znak, więc w pętli policz ile w pobranym łańcuchu jest znaków, które chcesz policzyć.
Przydatna będzie funkcja isspace z cctype.

0
YooSy napisał(a):

Użyj funkcji std::getline(). Operator >> pobiera jeden wyraz, jeden ciąg do najbliższego białego znaku.
Pobrany tekst funkcją getline (Marta Dluga) będzie miał długość 11, bo spacja to też znak, więc w pętli policz ile w pobranym łańcuchu jest znaków, które chcesz policzyć.
Przydatna będzie funkcja isspace z cctype.

Już sobie poradziłam
dzięki

0

Jeszcze raz proszę o pomoc. Chce napisać program, który będzie liczył ilość wyrazów w tekście napisanym przeze mnie w konsoli. Napisałam kod, ale gdzieś mam błąd i nie wiem gdzie. Proszę o poprawienie kodu.


```{
		int x = 1;
		string wyraz;
		cout << "Podaj tekst ";
		getline(cin, wyraz);
		int 1 = wyraz.length();
		if (1 > 0) {
			for (int i = 0; i < 1; i++) {
				if (tekst[i] == ' ') {
					x++;
				}
			}
		}
		else x = 0;
		cout << "Ilość wyrazów wynosi " << x << endl;
	}
0

W tym miejscu:

int 1 = wyraz.length();

Próbujesz nazwać zmienną 1 (słownie jeden) - to jest niedozwolone.
W C oraz C++ cyfry w nazwach mogą pojawiać się tylko jeśli pierwszy znak tej nazwy to litera.

Po naprawieniu tego błędu musisz pamiętać również o tych dwóch liniach:

if (1 > 0)
// oraz
for (int i = 0; i < 1; i++)
0

Poprawiłam, ale jak napisze tekst Marta Długa to mi podaje liczbę wyrazów 1 a są 2 wyrazy. Proszę o pomoc.


```{
		int x = 1;
		string wyraz;
		cout << "Podaj tekst " << endl;
		getline(cin, wyraz);
		int słowo = wyraz.length();
		if (słowo > 0) {
			for (int słowo = 0; słowo < 1; słowo ++) {
				if (tekst[słowo] == ' ') {
					x++;
				}
			}
		}
		else x = 0;
		cout << "Ilość wyrazów wynosi " << x << endl;
	}
0

Redefiniujesz zmienną słowo:

int słowo = wyraz.length(); // W tym miejscu słowo == długość wyrazu
if (słowo > 0) {
	for (int słowo = 0; słowo < 1; słowo ++) { // A w tym miejscu słowo == 0 (dlatego że robisz: int słowo = 0 )
		if (tekst[słowo] == ' ') {
			x++;
		}
	}
}
0

Jestem początkująca i nie wiem jak to poprawnie napisać. Proszę o pomoc

1

Musisz mieć nową zmienną w pętli for która będzie użyta aby odczytać n-ty znak z linii.

Zmieniłem nazwę zmiennej słowo na length:

int x = 1;
string wyraz;
cout << "Podaj tekst " << endl;
getline(cin, wyraz);
int length = wyraz.length(); // Długość linii
if (length > 0)
{
	for (int i = 0; i < length; i++) // Od pierwszego znaku (0) do ostatniego (length - 1)
	{
		if (wyraz[i] == ' ')
		{
			x++;
		}
	}
}
else
	x = 0;

cout << "Ilość wyrazów wynosi " << x << endl;
0

Dzięki, ale nie do końca rozumiem. Czy możesz mi opisać działanie programu kod z każdej linii zaczynając od if?

0

Proszę:

int length = wyraz.length(); // Długość linii
if (length > 0) // Jeżeli dłuogość jest większa niż 0 (odczytano przynajmniej 1 znak)
{
	/* Ta pętla posłuży nam do sprawdzania czy i-ty znak jest spacją.
	 * Zaczyna się ona od 0 (tak samo jak we wszystkich tablicach, pierwszy element to indeks 0)
	 * a kończy się gdy i będzie równe length (wtedy warunek nie zostanie spełniony i dalsza część
	 * pętli nie wykona się). To dlatego że ostatni znak znajduje się pod indeksem length - 1.
	 * Wyobraź sobie że masz tablicę składającą się z 3 elementów, pierwszy element to indeks 0, drugi indeks 1
	 * a trzeci do indeks 2 (ilość elementów - 1).
	 */
	for (int i = 0; i < length; i++)
	{
		/* Możesz odkomentować poniższą linię aby zobaczyć jak to działa: */
		// cout << "Sprawdzam czy znak: [" << wyraz[i] << "] jest spacją" << endl;
		if (wyraz[i] == ' ') // Sprawdź czy i-ty znak jest spacją, jeśli tak to:
		{
			x++; // Zinkrementuj x (dodaj 1 do obecnej wartości)
		}
	}
}
else // Jeżeli użytkownik nie wprowadził ani jednego znaku
	x = 0; // Ustaw ilość wyrazów na 0

cout << "Ilość wyrazów wynosi " << x << endl;
0

Tutaj nie potrzebujesz znać indeksów poszczególnych liter, więc można użyć prostszej pętli.

#include <iostream>
#include <string>
#include <cctype>

int main( int argc, char** argv )
{
  std::cout << "Wpisz tekst: ";
  std::string text;
  std::getline( std::cin, text );
  int words = ( text.length() ? 1 : 0 );
  for( char chr : text )
  {
    if ( std::isspace( chr ) ) 
      ++words;
  }
  std::cout << "Liczba wyrazow: " << words << "\n";
  return 0;
}
0
#include <iostream>
#include <string>
#include <sstream>

int main() {
   std::string text = "Marta Dluga";
   std::istringstream iss(text);
   std::string tmp;
   std::size_t coutner = 0u;
   while (iss >> tmp) {
      ++coutner;
   }
   std::cout << '\"' << text << '\"' << " ma " << coutner << " slow\n";
} 
0

Dzięki wszystkim teraz już rozumiem.

0
Oko Moskwy napisał(a):

Tutaj nie potrzebujesz znać indeksów poszczególnych liter, więc można użyć prostszej pętli.

#include <iostream>
#include <string>
#include <cctype>

int main( int argc, char** argv )
{
  std::cout << "Wpisz tekst: ";
  std::string text;
  std::getline( std::cin, text );
  int words = ( text.length() ? 1 : 0 );
  for( char chr : text )
  {
    if ( std::isspace( chr ) ) 
      ++words;
  }
  std::cout << "Liczba wyrazow: " << words << "\n";
  return 0;
}

Jednak jeszcze potrzebuje wytłumaczenia. Co oznacza:
? 1:0
chr : text
isspace

1

To jest tzw. operator wyrażenia warunkowego (po angielsku ternary operator)

int words = ( text.length() ? 1 : 0 );

Z tego omówię najpierw to:

text.length() ? 1 : 0

Ten zapis jest równoznaczny z tym (dlatego że wartości nie równe 0 oznaczają true, 0 oznacza false):

text.length() != 0 ? 1 : 0

Czyli jeżeli długość pobranego tekstu jest inna niż 0 (choć wiadomo że nie można mieć -1 znaków) to wartość będzie równa 1 (wartość po lewej stronie dwukropka), w przeciwnym razie będzie to 0 (wartość po prawej stronie dwukropka).
Ta wartość zostanie następnie przypisana do zmiennej words.

Można byłoby zapisać to za pomocą if-else:

int words;

if (text.length())
	words = 1;
else
	words = 0;

Na tej stronie jest to opisane bardziej ogólnie.

Ten kawałek kodu:

for( char chr : text )

to tzw. pętla for-each. Czyli zamiast używać indeksu możesz używać znaku ze zmiennej chr.

std::isspace(chr) 

Sprawdza czy znak jest spacją, tabulaturą, znakiem nowej linii i jeszcze kilka rzeczy. Więcej tutaj

0

Dzięki a co oznacza chr : text?

0

text to zmienna string. Możesz odwołać się do każdego znaku w tej pętli za pomocą tej pętli.

for (int i = 0; i < text.length(); i++)
	std::cout << text[i]; // Zauważ że tutaj używamy nadal zmiennej tekst ale odwołujemy się do i-tego znaku
// Ta pętla działa tak samo jak ta:
for (char chr : text) // Pętla automatycznie daje nam kolejny znak ze zmiennej text do zmiennej chr. Każda iteracja pętli to kolejny znak.
	std::cout << chr;

Przy okazji dodam jeszcze - gdy post (lub kilka postów) jest wartościowy zaznaczasz go kciukiem w górę, gdy post (może być tylko jeden) jest odpowiedzią na pierwsze pytanie które zadałaś oznaczasz go jako odpowiedź.

0

for (char słowo : wyraz) - czy można to zapisać w inny sposób?

0

Można zastąpić zwykłą pętlą for tak jak napisałem w poprzednim poście:

for (int i = 0; i < wyraz.length(); i++)
{
	wyraz[i]... // i-ta litera wyrazu
}
0
atmal napisał(a):

Można zastąpić zwykłą pętlą for tak jak napisałem w poprzednim poście:

for (int i = 0; i < wyraz.length(); i++)
{
	wyraz[i]... // i-ta litera wyrazu
}

A jest jeszcze jakiś prościejszy sposób oprócz tych dwóch?

1

A jest jeszcze jakiś prościejszy sposób oprócz tych dwóch?

Pętle są podstawowymi i najważniejszymi instrukcjami w programowaniu.
Nie przeskoczysz tego. Trzeba je ogarnąć. Nic prostszego nie wymyślisz.

0

Prościej niż

for (char chr : text)

się nie da.

0

Ok dzięki wszystkim

0

Czy możesz mi opisać działanie programu kod for (int i = 0; i < text.length(); i++)?

atmal napisał(a):

text to zmienna string. Możesz odwołać się do każdego znaku w tej pętli za pomocą tej pętli.

for (int i = 0; i < text.length(); i++)
	std::cout << text[i]; // Zauważ że tutaj używamy nadal zmiennej tekst ale odwołujemy się do i-tego znaku
0

Co tu jest do rozumienia? Ten kod wypisuje znak po znaku zawartość zmiennej text .

0

Jak inaczej można napisać ten kod?
if ( std::isspace( chr ) )
++words;

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