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

Sprawdzanie poprawności wpisanych danych

Object Storage Arubacloud
0 głosów
5,051 wizyt
pytanie zadane 8 grudnia 2015 w C i C++ przez Evelek Nałogowiec (28,960 p.)

Witam, chce sprawdzić czy tekst wpisany przez użytkownika w konsoli jest liczbą. Napisałem taki program:

#include <iostream>
using namespace std;

int main()
{
    int naturalna;
    cout << "Podaj liczbe naturalna:" << endl;
    while(!(cin >> naturalna && naturalna >= 0))
    {
        cin.clear();
        cin.sync();
    }
    cout << "Podana liczba to: " << naturalna;
    return 0;
}

I tutaj wszystko działa, wypisuje liczbę dopiero gdy jest większa lub równa 0. Problemem jest jednak to, że gdy wpisze do konsoli np. 3873wjdd to utnie mi litery a stwierdzi, że poprawnie wpisano dane i liczba to 3873. Jak zaradzić czemuś takiemu?

2 odpowiedzi

+1 głos
odpowiedź 8 grudnia 2015 przez Sebastian Fojcik Nałogowiec (43,020 p.)
edycja 8 grudnia 2015 przez Sebastian Fojcik
 
Najlepsza

Jeżeli chcesz sprawdzić poprawność absolutnie całego input'u, to nie ma wyjścia – musisz wczytać to jako tekst i sprawdzać literka po literce czy wszystkie podane znaki to są cyfry.
Jedynym wyjątkiem może być to, że przed liczbą może stać '+' (plus) lub '-' (minus). Ale Ty chcesz tylko liczby nautralne, więc tych przypadków nie rozpatrzę.

Kod zawsze uczy więcej niż tysiąc słów, więc:

include <iostream>
#include <string>
using namespace std;

int main()
{
	bool liczba = true;
	string naturalna;
	cout << "Podaj liczbe naturalna: ";
	cin >> naturalna;

	for( int i = 0; i < naturalna.length(); i++ )
	{
		if( !isdigit( naturalna[ i ] ) )
			liczba = false;
	}

	if( liczba )
		cout << "Podana liczba to: " << naturalna << endl;
	else
		cout << "Nie podano liczby naturalnej!" << endl;

	return 0;
}

Jeżeli będziesz miał potrzebę potraktować podaną liczbę jako liczbę a nie tekst, np. gdy chcesz wykonać na niej jakieś działanie, to music konwertować string na int. Standard C++11 zawiera kilka nowych funkcji w bibliotece <string>, które umożliwiają konwertowanie w różne strony. My chcemy string na int, więc funkcja, która to wykona nazywa się:
stoi( string ). W nawiasie podajemy string, a funkcja zwróci int. Nazwa funkcji mówi sama za siebie: stoi string-to-int.
Polecam poczytać: http://www.cplusplus.com/reference/string/stoi/

;-)

komentarz 8 grudnia 2015 przez Evelek Nałogowiec (28,960 p.)
Ładny warunek z użyciem isdigit, znam tą funkcje. Tylko jeszcze chciałbym to zamknąć w jednej pętli, jakbyś mógł w swoim programie to uwzględnić, czyli niech się pętla wykonuje dopóki nie zostanie wpisana liczba naturalna. :)
komentarz 8 grudnia 2015 przez Sebastian Fojcik Nałogowiec (43,020 p.)

Jasne. Wysyłam kod.

#include <iostream>
#include <string>
using namespace std;

int main()
{
	bool czy_liczba;
	string liczba;
	do
	{
		czy_liczba = true;
		cout << "Podaj liczbe naturalna: ";
		cin >> liczba;

		for( int i = 0; i < liczba.length(); i++ )
		{
			if( !isdigit( liczba[ i ] ) )
				czy_liczba = false;
		}
		if( !czy_liczba )
			cout << "Nie podano liczby naturalnej!" << endl;

	} while( !czy_liczba );

	int naturalna = stoi( liczba );
	
	cout << "Podana liczba to: " << naturalna << endl;
		
	return 0;
}

Zauważyłem jednak problem w rozwiązaniu wcześniej. Ten kod konwertuje liczbę na int przed wypisaniem i jest to konieczne! W przeciwnym wypadku po podaniu liczby: 0000001, program wypisze 0000001. Natomiast w powyższym przykładzie rozwiązałem ten problem konwertując string na int o czym pisałem wcześniej

komentarz 8 grudnia 2015 przez Evelek Nałogowiec (28,960 p.)
edycja 8 grudnia 2015 przez Evelek
Ślicznie dziękuje. :) Tylko jeszcze takie coś mi wyrzuca:

cpp|26|error: cannot convert 'std::string {aka std::basic_string<char>}' to 'const char*' for argument '1' to 'int atoi(const char*)'|

W linijce 26 pokazuj taki błąd. Dodałem bibliotekę <stdlib.h> ale nie rozwiązało to problemu.

 

/////

Zamieniłem stoi na atoi i stąd ten błąd. Jeśli jest stoi to pokazuje że not declared in this scope.
komentarz 8 grudnia 2015 przez Sebastian Fojcik Nałogowiec (43,020 p.)

W takim razie nie piszesz w nowym standardzie C++11. Musisz to przeboleć :-P

" 'int atoi(const char*)'"

Błąd polega na tym, że funkcja "atoi" przyjmuje jako argument tablicę znaków (const char*).
Jeżeli więc w swoim programie wywołujesz gdzieś tę funkcję "atoi" i przekazujesz jej string, to wywołaj ją tak: 
atoi( liczba.c_str() );

Metoda (funkcja) c_str() zwraca wartość w postaci łancucha znaków const char*, a właśnie taki typ przyjmuje funkcja atoi.

Aby używać funkcji atoi należy dołączyć bibliotekę <cstdlib>.

Pozdrawiam :-)

(Staraj się nie używać bibliotek z końcówką ".h", bo w C++ się z nich nie korzysta. Wytłumaczyłem to tutaj:
https://forum.pasja-informatyki.pl/84632/spotykanie-zapisu-c-c )

komentarz 8 grudnia 2015 przez Evelek Nałogowiec (28,960 p.)
Bardzo dziękuje, super lekcja od Ciebie! :) Zawsze to troszkę więcej się wie niż przedtem. Właśnie czytam ten artykuł.

Pozdrawiam.
0 głosów
odpowiedź 8 grudnia 2015 przez Grzyboo Nałogowiec (28,860 p.)
if(cin.good())

Podobne pytania

0 głosów
1 odpowiedź 1,252 wizyt
pytanie zadane 13 października 2019 w C i C++ przez dudduss76 Początkujący (280 p.)
0 głosów
0 odpowiedzi 508 wizyt
pytanie zadane 21 lutego 2017 w Java przez plkpiotr Stary wyjadacz (12,420 p.)
0 głosów
1 odpowiedź 374 wizyt
pytanie zadane 2 kwietnia 2021 w C i C++ przez Dawidziu Bywalec (2,610 p.)

92,556 zapytań

141,404 odpowiedzi

319,560 komentarzy

61,942 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!

...