• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Znaki zamiast liczby.

Object Storage Arubacloud
+1 głos
220 wizyt
pytanie zadane 7 lutego 2021 w C i C++ przez Kacperek_code Obywatel (1,690 p.)

Witam, napisałem program, który ma funkcję przeglądającą łańcuch w poszukiwaniu podanego znaku. Funkcja posiada dwa parametry pierwszy
typu wskaźnik do char, drugi typu char i zwraca ilość wystąpień tego znaku w łańcuchu. Jeżeli znak nie wystąpi
wypisać odpowiedni komunikat.

Coś jest nie tak bo zamiast zwracać liczbę ilości wystąpienia znaku to zwraca jakieś buźki uśmiechnięte albo serduszka. Co skopałem? 

I jak sprawdzić, czy dany znak wystąpił w łańcuchu?

PS. WIEM, ŻE NAZWY FUNKCJI I ZMIENNYCH POWINNY BYĆ PO ANGIELSKU. 

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


int dlugosc(char lancuch[])
{
	int index;

	for (index = 0; lancuch[index] != '\0'; ++index);

	return index;
}


char szukajZnaku(char* wsk, char ilosc)
{
	char znak;
	std::cout << "\nPodaj znak: ";
	std::cin >> znak;
	ilosc = 0;

	for (int i = 0; i < strlen(wsk); i++)
	{
		if (wsk[i] == znak)

		{
			ilosc++;
		}
	}

	return ilosc;
}

int main()
{
	char line[100];
	while (1)
	{
		std::cout << "Podaj lancuch: ";

		if (fgets(line, sizeof(line), stdin))
		{
			char* p = strchr(line, '\n');
			if (p) *p = 0;
		}
		std::cout << "Dlugosc wynosi: " << dlugosc(line) << " ";
		break;
	}

	char ile = 0;
	std::cout << szukajZnaku(line, ile);

	std::cin.ignore();
	std::cin.get();
	return 0;
}

 

3 odpowiedzi

+3 głosów
odpowiedź 7 lutego 2021 przez overcq Pasjonat (21,650 p.)

char nie służy generalne na licznik, po zadeklarowaniu jako int działa.

komentarz 7 lutego 2021 przez Kacperek_code Obywatel (1,690 p.)
To samo mówiłem Pani Doktor na studiach.... No, ale cóż. Uparła się na typ 'char' i ma on zwracać ilość... Jest jakiś sposób na zrobienie tego z 'charem' (jakaś konwersja z char na int) czy nie bardzo?
3
komentarz 7 lutego 2021 przez overcq Pasjonat (21,650 p.)
static_cast<int>()
1
komentarz 7 lutego 2021 przez TOM_CPP Pasjonat (22,640 p.)

@Kacperek_code,

Uparła się na typ 'char' i ma on zwracać ilość

Typ char ma reprezentację 1 bajtową, czyli maksymalna liczba jaką można przedstawić przy pomocy niego to 256. Co jeśli w danym ciągu znakowym jakiś element będzie występował więcej razy niż 256?

komentarz 7 lutego 2021 przez Kacperek_code Obywatel (1,690 p.)
Dobre pytanie
+3 głosów
odpowiedź 7 lutego 2021 przez Kabuuz Bywalec (2,820 p.)
Zwracasz char więc zamiast liczby dostaniesz odpowiadający tej liczbie znak w ASCII. Dlaczego podajesz do funkcji szukajZnaku argument ilość i do tego w charze? Ogólnie to jeśli wolałbyś pracować na stringach to masz do dyspozycji funkcję  std::count, która może zliczyć ilość wystąpień jakiegoś znaku.
komentarz 7 lutego 2021 przez Kacperek_code Obywatel (1,690 p.)

Funkcja posiada dwa parametry pierwszy
typu wskaźnik do char, drugi typu char i zwraca ilość wystąpień tego znaku w łańcuchu.

1
komentarz 7 lutego 2021 przez Kacperek_code Obywatel (1,690 p.)
Uwierz mi, że to nie mój wymysł.
komentarz 7 lutego 2021 przez Kabuuz Bywalec (2,820 p.)

Wierzę, po prostu nie zauważyłem komentarza pod inną odpowiedzią wink

+3 głosów
odpowiedź 7 lutego 2021 przez TOM_CPP Pasjonat (22,640 p.)

Użyj std::string i funkcji std::count() a kod ulegnie kilkukrotnemu zmniejszeniu:
 

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    string text; char sign;
    cout << "Enter text" << endl; cin >> text;
    cout << "Enter sign" << endl; cin >> sign;

    auto number = count(cbegin(text),cend(text),sign);
    cout << (number == 0 ? "Does not exist":to_string(number));
}

 

komentarz 7 lutego 2021 przez VBService Ekspert (252,740 p.)

Chyba lepiej użyć:  wink

getline(cin, text);

zamiast

cin >> text;

 

1
komentarz 7 lutego 2021 przez TOM_CPP Pasjonat (22,640 p.)

To zależy czy w łańcuchu tekstowym mogą występować spacje. Jeżeli tak, to rzeczywiście trzeba użyć getline.

Podobne pytania

0 głosów
1 odpowiedź 307 wizyt
pytanie zadane 19 stycznia 2021 w C i C++ przez Mytwi Nowicjusz (160 p.)
0 głosów
3 odpowiedzi 549 wizyt
pytanie zadane 12 stycznia 2020 w C i C++ przez dominik195k Obywatel (1,030 p.)
0 głosów
1 odpowiedź 283 wizyt
pytanie zadane 17 grudnia 2022 w C i C++ przez Stahious Nowicjusz (150 p.)

92,555 zapytań

141,402 odpowiedzi

319,540 komentarzy

61,938 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...