best.Anzahl Elemente Array zuweisen, C++

Hallo, ich möchte die in das Array buffer eingegebene Zeichen in das Array newpassword übertragen. Ich weiss aber nicht, wieviele Zeichen eingegeben werden und kann somit die länge von newpassword nicht definieren. Ich habs schon so versucht:

Code:
char buffer[80];
 char newpassword[???];
 for (int i=0;i < 80; i++)
{  
  buffer[i] = _getch(); //array buffer wird mit befehl getch gefüllt
  cout << "*";
 
 
  if (buffer[i] == '#')  //zum Beenden mit '#'
  {                 
  break;
  }    
   counter++;
   




}
for (int z=0; z < counter; z++)
{
 newpassword[z] = buffer[z];
}

Mit dem counter werden alle vom User eingegebenen Elemente in dasArray newpassword übertragen. Die restlichen (80 - anzahl eingaben) werden nicht beachtet.

Nun wie gesagt meine Frage:
Wie soll ich newpassword initialiseren? Ich weiss ja die Länge der eingabe nicht...


Edit: Vielen Danke für die Hilfe :)
 
Vom Prinzip sollte das hier funktionieren, aber leider nicht so wie du es wohl beabsichtigst, da standartmäßig wie es scheint die Eingabe am Bildschirm gepuffert wird, und erst per Enter abgeschickt wird.

Somit ist das Problem gegeben, das das eingegebene Passwort sichtbar ist, und die * erst später wenn getch() wirklich die Eingabe (nach Enter) erhält dargestellt werden. (Was, wenn ich es richtig sehe, nicht deine Erwartung ist)

Aber das war ja nicht das eigentliche Problem, das Problem mit der unbekannten Char-Array-Größe kannst du wie folgt lösen. (Das Eingabepuffer Problem werd ich mir die Tage mal ansehen, hab mich bisher noch nie damit rumschlagen müssen, sowas wie eine getkey()-Funktion wäre sicher nicht schlecht.)

Code:
  char buffer[80];
  for (int i=0;i < 80; i++) {  
    buffer[i] = getchar();
    cout << '*' << flush;
    if (buffer[i] == '#') {
      buffer[i] = '\0';
      break;
    }
  }
  char * password = new char[strlen(buffer)];
  strcpy(password,buffer);

Grüße phx1024
 
bei getch() wird doch nichts auf den bildschirm geschrieben das wäre dan getche()

und war getch() nicht das gleiche wie getchar()???

oder vertue ich mich da jetzt vollkommen?
 
@sash: jo, du hast recht wies aussieht *G* _getch() nimmt eingabe direkt von der Tastatur. Nur hab ich in meiner Referenz keine _getch()-Funktion gefunden als ich gestern nachgesehen habe. Aber ich hab nochmal gezielt danach gesucht und auch was gefunden dazu :-)


So wies nun ist, erfüllt der Code wenn ich mich nicht irre alle Anforderungen *G*

Code:
#include <stdio.h>
#include <conio.h> //notwendig für _getch() und _kbhit()
#include <iostream>

using namespace std;

int main()
{
  char buffer[80];
  cout << "Passwort:";
  for (int i=0;i < 80; i++) {  
    while(!_kbhit()); //auf tastendruck warten
    buffer[i] = _getch();
    if ((buffer[i] == '#')||(buffer[i] == 13)) { //Ende bei druck auf [#] oder [Enter]
      buffer[i] = '\0';
      cout << "\n";
      break;
    }
    else {
      cout << '*' << flush;
    }
  }
  char * password = new char[strlen(buffer)];
  strcpy(password,buffer);
  cout << "Passwort ist \"" << password << "\" gewesen.\n";
  while(!_kbhit());
  return 0;
}
 
Original von phx1024
Code:
#include <stdio.h>
#include <conio.h> //notwendig für _getch() und _kbhit()
#include <iostream>

using namespace std;

int main()
{
  char buffer[80];
  cout << "Passwort:";
  for (int i=0;i < 80; i++) {  
    while(!_kbhit()); //auf tastendruck warten
    buffer[i] = _getch();
    if ((buffer[i] == '#')||(buffer[i] == 13)) { //Ende bei druck auf [#] oder [Enter]
      buffer[i] = '\0';
      cout << "\n";
      break;
    }
    else {
      cout << '*' << flush;
    }
  }
  char * password = new char[strlen(buffer)];
  strcpy(password,buffer);
  cout << "Passwort ist \"" << password << "\" gewesen.\n";
  while(!_kbhit());
  return 0;
}
Super, läuft perfekt!!! Danke :)

Hab nur noch diese Frage(n):
Code:
cout << '*' << flush;
Was macht "flush"?
Code:
while(!_kbhit());
Was hier passiert ist mir auch nicht ganz klar ...

Der Rest ist mir klar :)

Danke!!!!!
 
flush() leert den Bildschirmspeicher!


wenn du z.b.

cout << "*";
sleep(1);
cout << "*";

machst, wirst du feststellen, das erst keine, dann 2 * kommen!


Mfg Blacki
 
das
Code:
while(!_kbhit());
bewirkt nichts weiter als das er auf einen Tastendruck wartet.
Denn _getch() ist meines Wissens zufolge nichts "Blockendes" so das das Programm nicht an der Stelle wartet bis eine Taste gedrückt wird. die Funktion _kbhit() (bedeutend mit KeyBoardHIT) gibts solange false zurück bis eine Taste gedrückt wurde, und somit hast du solange keine Taste gedrückt wird eine Warteschleife :) mehr is das nicht ;)

grüße phx1024
 
Zurück
Oben