2011-07-18 7 views
10

Jestem nowy na C++ pochodzący z tła python.jak zadeklarować zmienną zanim dowiesz się jaki to jest typ danych?

Jeśli chcę wprowadzić dane od użytkownika, a następnie chcę sprawdzić, jaki typ danych to wejście (np. Liczba całkowita lub zmienna), w jaki sposób mogę zadeklarować zmienną, do której chcę przypisać dane wejściowe użytkownika?

+0

Myślę, że prawdopodobnie potrzebujesz tylko pływaka lub podwójnego. Mogą zawierać liczby całkowite i ułamkowe. –

Odpowiedz

22

Krótka odpowiedź: Nie możesz.

Długa odpowiedź: Nie możesz. C++ jest statycznie napisanym językiem, co oznacza, że ​​musisz zdefiniować typ w czasie kompilacji. Python jest wpisywany dynamicznie, więc typ obiektu może zmieniać się z linii na linię.

Jeśli chcesz uzyskać pewne dane wejściowe od użytkownika, możesz po prostu użyć ciągu znaków.

Na przykład, jeśli chcesz uzyskać całkowitą wejściowe od użytkownika: Wejście

int n; 
std::cin >> n; 

Float:

float x; 
std::cin >> x; 

i tak dalej. Zanotuj w tych dwóch przypadkach, jeśli użytkownik wprowadzi coś innego niż liczbę całkowitą lub zmienną, będziesz musiał sprawdzić flagę std :: cin, aby sprawdzić, czy wystąpił błąd.

Ale musisz powiedzieć użytkownikowi "Wpisz teraz liczbę całkowitą" lub "Wprowadź teraz zmienną". Nie możesz po prostu zaakceptować jakiegoś dowolnego typu. Zamiast tego zaprojektuj swój kod, aby mieć alternatywne ścieżki kodowe do wprowadzania liczb całkowitych lub zmiennoprzecinkowych. Lub wymuś jeden lub drugi i wydrukuj błąd, gdy podają niewłaściwy typ danych wejściowych.

Nie pisz swojego kodu, tak jak w Pythonie. Kod pseudonimu Idiomatic nie jest idiomatycznym kodem w języku C++, a sposób, w jaki wykonujesz zadania, nie wygląda tak samo.

w C++ sposób, aby uzyskać dowolny wejście będzie wyglądać następująco:

std::string input; 
std::cin >> input; 

if (IsInteger(input)) 
{ 
    // do stuff with integer 
} 

else if (IsFloat(input)) 
{ 
    // do stuff with float 
} 

else 
{ 
    std::cout << "Bad Input!" << std::endl; 
} 

EDIT: Jak MSalters zauważył w komentarzu, można faktycznie korzysta boost::lexical_cast<T>(expr) rzucić reprezentację ciąg do pewnego typu T (Gdzie T jest zwykle czymś w rodzaju int, float, double, itp.). Zauważ, że prawdopodobnie będziesz musiał jeszcze sprawdzić, czy expr jest liczbą całkowitą, zmiennoprzecinkową lub w inny sposób.

+1

+1 dla kodu Idiomatic Pythona nie jest idiomatycznym kodem C++ – Mark

5

Gdy otrzymasz dane od użytkownika, pojawi się jako string. Na przykład:

std::string inp; 
std::cin >> inp; 

Następnie należy wziąć zawartość inp (co jest co użytkownik wpisane), a wewnątrz niego spojrzeć, aby zobaczyć, co zawiera znaki. W tym momencie możesz podejmować decyzje w oparciu o to, czy zawiera (a) wszystkie cyfry, (b) cyfry i kropkę dziesiętną, lub (c) coś zupełnie innego.

+0

Wiele lokalnych ustawień używa ',' jako separatora dziesiętnego. Inni używają go jako separatora tysięcy. Internacjonalizacja jest trudna. –

+2

'boost :: lexical_cast (inp)' użyje bieżących ustawień narodowych. Nie tak trudno, naprawdę, najtrudniej jest poradzić sobie z realnymi użytkownikami, którzy je mieszają. – MSalters

3

Znacznie lepiej jest zebrać ciąg znaków od użytkownika, a następnie przeanalizować go.

To pytanie jest miejscem do poszukiwania odpowiedzi: How to parse an int from a string

1

C++ jest statycznie napisanym językiem. Wszystkie typy zmiennych muszą być znane w czasie kompilacji.

1

Python jest językiem napisanym dynamicznie, a wręcz przeciwnie, c/C++ są statycznie wpisanymi językami. Nie można znaleźć typu i zadeklarować w czasie wykonywania.

Powiązane problemy