konto usunięte

Temat: jak w C++ sprawdzić czy wczytany znak jest int'em?

Mam mniej więcej taki kod:

"...
int l=0;
while ((l<1) || (l>20))
{
cout << "Podaj liczbę (1-20): ";
cin >> l;
}
..."

jak poda się jakiś znak poza liczbą, to program się zapętla... nie chce wykonywać następnego wczytania (cin), tylko wypisuje cały czas ten sam tekst ("Podaj ..."). Czym się posłużyć, aby zabronić podawania liter?

PS. Korzystam z tekstowego kompilatora borland C/C++.

konto usunięte

Temat: jak w C++ sprawdzić czy wczytany znak jest int'em?

Program się zapętla, bo przy czytaniu liczby strumień wejściowy zatrzymuje się na pierwszym znaku nie będącym cyfrą i znak ten zostaje w strumieniu wejściowym. Zostaje więc po nawrocie pętli ponownie wczytany, znów pozostawiony w strumieniu wejściowym i tak w kółko. Żeby temu zapobiec trzeba czytać znak po znaku np. przez cin.get(), następnie ignorować wszystko poza cyframi (isdigit()) i albo gromadzić cyfry w buforze, na którym potem użyjemy atol(), albo zamieniać na bieżąco np. tak:

l = l * 10 + c - '0';

gdzie zmienna 'c' zawiera wczytany znak.

konto usunięte

Temat: jak w C++ sprawdzić czy wczytany znak jest int'em?

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

int isInt( char *ptr ){
char c;
while( ( c = *ptr++ ) != 0 ){
if( (c >= 'a' && c <= 'z') || ( c >= 'A' && c <= 'Z' ) )
return 0;
}
return 1;
}

int main( int argc, char **argv ){
char buffer[ 100 ];

while( 1 ){
cout << "Wpisz" << endl << flush;
cin >> buffer;
if( isInt( buffer ) ){
cout << "To jest liczba" << endl << atoi( buffer ) << endl << flush;
}
if( buffer[0] == 'q' )
break;
}
}

Troche tu moje c wylazi bo da sie tu jeszcze pobawic kontenerami ale mam nadzieje ze o to chodzi.

konto usunięte

Temat: jak w C++ sprawdzić czy wczytany znak jest int'em?

Paweł S.:
while( ( c = *ptr++ ) != 0 ){
if( (c >= 'a' && c <= 'z') || ( c >= 'A' && c <= 'Z'

O, a od kiedy cyfry są od A do Z? ;-)

Poza tym zamiast tak kombinować to wystarczy:

while (c = *ptr++) if (!isdigit(c)) return 0;

W końcu po coś biblioteka standardowa istnieje... A przy okazji zgadnij co zwróci Twoja funkcja jak podasz jej łańcuch pusty.

konto usunięte

Temat: jak w C++ sprawdzić czy wczytany znak jest int'em?

Zwracam w tym przypadku 0, co oznacza ze nie jest to cyfra.
tak wlasnie zapomnialem o tej funckji isDigit(), czekalem az ktos mi ja przypomni i napisze.
Domyslam sie co zwroci funkcja, no ale to tylko przyklad w ktora strone isc.
Jakub L.

Jakub L. Programista

Temat: jak w C++ sprawdzić czy wczytany znak jest int'em?

Paweł S.:
Zwracam w tym przypadku 0, co oznacza ze nie jest to cyfra.

A jak dostaniemy ~!@#$%^&*()_+`-=[]{};':",./<>?|\ęĘóÓąĄśŚłŁżŻźŹćĆńŃ to robi nam się bardzo smutno?
tak wlasnie zapomnialem o tej funckji isDigit(), czekalem az ktos mi ja przypomni i napisze.

isdigit(), to nie Java i camelCase nie jest specjalnie popularny w bibliotece standardowej.
Domyslam sie co zwroci funkcja, no ale to tylko przyklad w ktora strone isc.

Słaby. Setny znak wczytany z klawiatury ma spore szanse na rozwalenie aplikacji, memset(buffer, 0, 100) też byłby nie od rzeczy.
A skoro używamy strumieni to to jest C++ które ma std::string i kupę fajnych rzeczy typu iteratory albo inne strumienie (std::stringstream na przykład).

konto usunięte

Temat: jak w C++ sprawdzić czy wczytany znak jest int'em?

Nie chcialo mi sie juz bawic w String'i i inne kontenery, to mozna rzeczywiscie ladnie napisac i objektowo, tylko mysle ze tu chodzilo o przyklad.

konto usunięte

Temat: jak w C++ sprawdzić czy wczytany znak jest int'em?

Dzięki chłopaki za burzliwą dyskusję :) Już wszystko działa, także dzięki za pomoc!

konto usunięte

Temat: jak w C++ sprawdzić czy wczytany znak jest int'em?

Hej,

ja pewnie juz post-factum ale ja do tego wykorzystalbym istringstream-a cos a'la takiego:

#include <iostream>
#include <sstream>
using namespace std;
int main() {
int i=-1;
string s;
istringstream sstr;
while (!(i>1 && i<20)) {
cin >> s;
sstr.str(s);
if (!(sstr >> i)) { i=-1; }
sstr.clear();
cout << i << endl;
}
return 0;
}

nie przepisywac w ciemno bo pisane z palca ;) ale tak mniej wiecej bym to zrobil :)

ps1. ale tandeta, nie obsluguje [code] :/[edited]Grzegorz Z. edytował(a) ten post dnia 13.10.07 o godzinie 21:46[/edited]

konto usunięte

Temat: jak w C++ sprawdzić czy wczytany znak jest int'em?

int zmienna = int();

if( cin >> zmienna ) {
// odczyt powiodl sie, wykorzystaj to
..
}

piotr

konto usunięte

Temat: jak w C++ sprawdzić czy wczytany znak jest int'em?

int i = 0;
if (std::scanf("%i", &i) == 1)
{
//
}
Juliusz Mikoda

Juliusz Mikoda Projektant,
programista

Temat: jak w C++ sprawdzić czy wczytany znak jest int'em?

Rozwiązanie jest banalnie proste.
Ponieważ znak nie jest liczbą w strumieniu ustawiany jest stan failbit i dane w strumieniu pozostają. Kolejne odczyty nie powodują zmiany stanu strumienia i dlatego program zapętla się.
Nasuwające się rozwiązanie to przywrócenie poprawnego stanu strumienia i likwidacja zalegających w nim znaków:

int l=0;
while ((l<1) || (l>20)) {
cout << "Podaj liczbę (1-20): ";
if (!(cin >> l)) {
cin.clear();
cin.ignore(1000, '\n');
}
}
Tadeusz Pyś

Tadeusz Pyś ..czyli samo zuo ;)

Temat: jak w C++ sprawdzić czy wczytany znak jest int'em?

cin.ignore(1000, '\n');

drobna uwaga - lepiej uzyc:

cin.ignore(numeric_limits<int>::max(), '\n');

powoduje pominiecie dowolnej liczby znakow, nie tylko pierwszego tysiaca -- co mogloby czasem byc zbyt radosnym zalozeniem :)
Juliusz Mikoda

Juliusz Mikoda Projektant,
programista

Temat: jak w C++ sprawdzić czy wczytany znak jest int'em?

Trafna uwaga, zasugerowałem się, że autor napisał:
Jędrzej Janusz:
jak poda się jakiś znak poza liczbą, to program się zapętla... nie chce wykonywać następnego wczytania (cin)

Następna dyskusja:

Turbo Pascal - czy jest do ...




Wyślij zaproszenie do