Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Jakiś sposób do kontrolowania strumienia wejścia podczas wpisania danych

Ostatnio zmodyfikowano 2014-04-10 20:59
Autor Wiadomość
00Andre
Temat założony przez niniejszego użytkownika
[C++] Jakiś sposób do kontrolowania strumienia wejścia podczas wpisania danych
» 2014-04-10 18:33:01
Siemka

Mam nie typowy mały problem, więc chce, aby podczas podawania danych(np string'a) jakoś funkcją kontrolować ile zostało wprowadzonych znaków do strumienia.

Zrobione mam sprawdzenie czy długość string'a nie przekracza ale po wprowadzaniu danych, a nie podczas podawania

Mi chodzi o np pisze Podaj imie: no więc podajesz (rozmiar maksymalny np. 20) i chce w jakiś sposób aby strumień wejścia liczył ile znaków zostało wprowadzone, w razie przekroczenia rozmiaru maksymalnego to zakończyć wprowadzanie. (bez udziału gracza).

Trochę to dziwne , ale bardzo mi to potrzebne jest i nie wiem jak to wykonać.

00Andre
P-107999
alixir
» 2014-04-10 19:38:41
Mowa oczywiście o konsoli?

Myślę, że to dość trudne do rozwiązania. Są na to przynajmniej 2 sposoby:

1. Kontrolujesz każdy wprowadzany znak, dopisując go do zmiennej.
Zaleta - można zakończyć wprowadzanie po przekroczeniu ustalonej liczby lub wciśnięciu Entera
Wada - nie można używać Backspace do kasowania znaków

2. Pozwalasz użytkownikowi wprowadzić dowolną ilość znaków, ale wczytujesz tylko ustaloną ilość.
Zaleta - można modyfikować dane podczas wprowadzania
Wady - użytkownik nie widzi informacji o przekroczeniu limitu znaków, choć można to wyświetlić na końcu

Pierwszy sposób można by rozwiązać np. w tym stylu:
C/C++
char temp;
std::string imie = "";
int i = 0;

std::cout << "Podaj imie (max 10 znakow): ";
while( static_cast < int >( temp = getch() ) != 13 && i < 10 ) {
    std::cout << temp;
    imie += temp;
    i++;
}

std::cout << std::endl << imie << std::endl;

[Dodano]
Po namyśle stwierdzam, że pierwszy sposób można zmodyfikować, aby dało się używać backspace. Myślę, że ta metoda cię zadowoli.

C/C++
#include <iostream>
#include <string>
#include <conio.h>
#include <ctype.h>

int main() {
   
    char temp;
    std::string imie = "";
    int i = 0;
   
    std::cout << "Podaj imie (max 10 znakow): ";
    while( static_cast < int >( temp = _getch() ) != 13 && i < 10 ) {
        if( isalpha( temp ) ) { // jeśli znak jest literą
            std::cout << temp;
            imie += temp;
            i++;
        }
       
        if( static_cast < int >( temp ) == 8 ) { // backspace
            std::cout << "\b" << " " << "\b";
            imie.erase( imie.length() - 1, 1 );
        }
    }
   
    std::cout << std::endl << imie << std::endl;
   
    return( 0 );
}
P-108003
00Andre
Temat założony przez niniejszego użytkownika
» 2014-04-10 20:59:02
Bardzo dziękuje za pomoc alxir. Miałem własną funkcję ale twoja jest łatwiejsza i bardziej elegancka użyje ją w programach i grach. Będziesz w Autorach ;)

00Andre
P-108016
« 1 »
  Strona 1 z 1