Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Programmiersprache C++

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
14.01.2012, 15:32 Uhr
Indacol



Hallo Leute, Ich hoffe ich bin im richtigen Thread bzw. Thema!
Ich habe mich gerade erst eingeloggt, kenne mich hier also noch nicht aus!
Also bitte nicht böse nehmen, Danke!
Zu meiner Frage:

Ich gehe gerade Informatik-HTL und habe den folgenden Befehl noch nicht gelernt, bräuchte ihn jedoch um ein Programm zu schreiben, der Befehl soll folgendes bewirken:
Ich möchte eine Zahl eingeben, die aber nicht angezeigt wird.
Es soll ein Zahlen-Ratespiel werden und deshalb bräuchte ich diesen Befehl!

Beispiel:
Der Befehl
scanf("%d",&a")
soll versteckt werden.

Bitte um Antwort und Danke!

ps. Bitte nicht böse nehmen wenn ich einen Fehler gemacht habe!

DANKE
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
14.01.2012, 17:23 Uhr
0xdeadbeef
Gott
(Operator)


Zunächst ist

C++:
scanf("%d", &a);


eher C als C++ - in C++ schriebe man

C++:
std::cin >> a;



Was dein Vorhaben angeht: Weder der C- noch der C++-Standard decken das ab, aber es gibt andere Spezifikationen dafür. Unter Unices aller Art (das schließt Linux mit ein und sollte auch unter Mac OS X gehen) ginge das beispielsweise so:

C++:
#include <iostream>
#include <termios.h>
#include <unistd.h>

int main() {
  struct termios attr_old, attr_new;
  int x;

  // Terminaloptionen holen
  tcgetattr(STDIN_FILENO, &attr_old);

  // Echo-Flag abschalten, dabei alte Optionen merken (d.h. Änderungen an
  // Kopie) und neue Terminal-Optionen anwenden
  attr_new = attr_old;
  attr_new.c_lflag &= ~ECHO;
  tcsetattr(STDIN_FILENO, TCSANOW, &attr_new);

  std::cin >> x; // respektive scanf("%d", &x);

  // Am Ende die alten Optionen wieder herstellen.
  tcsetattr(STDIN_FILENO, TCSANOW, &attr_old);

  std::cout << x << std::endl; // respektive printf("%d\n", x);
}


In C++ sollte man das natürlich in einen RAII-Wrapper verpacken; denkbar wäre beispielsweise

C++:
#include <iostream>

#include <termios.h>
#include <unistd.h>

class tcattr_raii {
public:
  tcattr_raii(int fd = STDIN_FILENO) : fd_(fd) {
    tcgetattr(fd_, &attr_old_);
    attr_new_ = attr_old_;
  }

  struct termios &attr() { return attr_new_; }
  void apply(int when = TCSANOW) { tcsetattr(fd_, when, &attr_new_); }

  ~tcattr_raii() {
    tcsetattr(fd_, TCSANOW, &attr_old_);
  }

private:
  int fd_;
  struct termios attr_old_;
  struct termios attr_new_;
};

int main() {
  tcattr_raii termoptions;
  int x;

  termoptions.attr().c_lflag &= ~ECHO;
  termoptions.apply();

  std::cin >> x;
  std::cout << x << std::endl;
}


...jetzt nur so hingekladdet. Wahrscheinlich wäre es am Ende sinnvoller, die Implementationsdetails zu verstecken und ein Interface zu entwerfen, das dem entspricht, was man wirklich braucht; dann ist das später leichter zu portieren.

Unter Windows geht das bestimmt auch irgendwie, aber wie genau weiß ich aus dem Stand nicht.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 14.01.2012 um 17:23 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
14.01.2012, 17:32 Uhr
Indacol



Okay, danke für die antwort bzw. für die investierte Arbeit )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: