"C" Passwort,Suchen, Ausgabe HELP


XuLo

Grünschnabel
Hallo liebe Community,

Ich bin absolut neu und bin vor kurzen angefangen C zu lernen.
Also ich hab folgendes Problem und zwar möchte ich ein Programm schreiben, wo ich zuerst ein Passwort eingeben muss. Nach einer Zahlen eingabe soll das Programm in einer .txt datei die Zahlen suchen und die gesamte Zeile in der Anwendung ausgeben.
Ich habe mit dem Passwort angefange und klappt 1a nur wollte ich die Passwort eingabe mit *-chen formatieren aber ich weiß nicht wie :(.
Zur Info ich benutze Dev++

Code:
#include <stdio.h>

void main (void)

{
    int pw1;
    pw1==123;
    FILE *datei; 
    datei = fopen ("test.txt","a+");
    printf ("\nBitte gebe Sie das Passwort ein : ");

    scanf ("%d",&pw1);
   
    if (pw1 != 123)
    
    {
    
    printf ("\nDas Passwort ist FALSCH!\n");
    printf ("\nSie haben noch 1 Versuch!\n\n\n\n");

    }
      
        
    if (pw1 == 123)
    main:
        {
            printf ("\nDas Passwort is RICHTIG!\n");
            system ("PAUSE");
        }        
    
    else                                 

    { 
            printf ("\nBitte gebe Sie erneut das Passwort ein : ");
            scanf ("%d",&pw1);
            if (pw1 != 123)
    
        {
            printf ("\nDas Passwort ist FALSCH!\n");
            printf ("\nDas Programm beendet sich nun!\n\n\n\n");
            system ("PAUSE");
        }
    else
        {
            goto main;
        }    
    }    
}

So und nun kommt die ausgabe des textes... da habe ich auch schon was geschrieben allerdings gehen die Zeilen sofort runter im Fenster wenn ich die exe starte
und bei der such funktion bin ich auch noch an rätseln... hier der code:

Code:
#include <stdio.h> 
void main ( void )  
{ 

FILE *datei;  
char zeichen[3];
datei = fopen ("test.txt" , "r+t" ); 

if (datei == NULL )  
{ 

printf ("\nDie Datei konnte nicht geöffnet werden!\n");
} 
else 
{ 
system ("PAUSE"); 
while (( zeichen[3] = getc(datei)) ) putc (zeichen[3], stdout); 
fclose (datei);  
}
system ("PAUSE");
}

Ich hab keine Ahnung woran das liegt:confused:
Noch eine Frage:
Ist es möglich den ausgegebenen Text nach einer bestimmten Zeit löschen zu lassen?
Und wenn alles klappt füge ich alles zusammen :)

Ich würde mich freuen wenn ihr mir ein paar Tipps geben könntet :)

Gruß Christoph
 

Kangaxx

Mitglied
Hallo,

zu deinem Passwort, wenn du die Eingabe mit *chen verbergen willst könntest du deine Eingabe mit getch() machen...

Schreib eine Schleife die solange Zeichen liest bis die gedrückte Taste "Enter" (13) is..

sieht ungefähr so aus:
C:
char pwd[100];
int k;
int    i = 0;

while( true )
{
 k = getch();         //Einlesen des zeichens.. keine Ausgabe in der Konsole!
   
    if( k == 13 )
    { 
           break;  //Bei Enter wird abgebrochen
    }
    else                            
    {
           pwd[i] = (char)(k);  //Anhängen an Passwort..
           printf("*");             //Sternchen schreiben
           i=(i+1);                //Position erhöhen...
    }
}

 //Ab hier Password-Prüfung etc...

Ich hab schon des längeren nix mehr mit C++ bzw C gemacht.. daher kanns sein das ich den ein oder anderen Fehler reingemacht hab... is au imho net die beste Lösung.
Eventuell solltest du noch auf die Rückgängig(Löschen) Taste eingehen...


Zu deinem zweiten Problem kann ich jetzt so net genau was sagen, hast dich bissle undeutig ausgedrückt.. aber da wird sich schon jemand finden!

gruss Kangaxx
 

XuLo

Grünschnabel
Hi,

Danke für die Hilfe aber ich bekomme immer ein fehler bei
while ( true ) fehler:

11 C:\Dev-Cpp\Test.c `true' undeclared (first use in this function)

sonst müsste das ja funktionieren.
Danke für die Hilfe :)

Gruß
 

deepthroat

Erfahrenes Mitglied
Hi.

Danke für die Hilfe aber ich bekomme immer ein fehler bei
while ( true ) fehler:

11 C:\Dev-Cpp\Test.c `true' undeclared (first use in this function)
Das liegt daran, das "true" nur in C++ bzw. in C (Standard von 1999) mit Einbinden des stdbool.h Headers verfügbar ist.

Gruß
 

XuLo

Grünschnabel
Ahhh super danke... das mit while klappt...
nur jetzt findet er bei "getch() =k " einen fehler :(..

14 C:\Dev-Cpp\testcpp.cpp `getch' undeclared (first use this function)

hab genau den code mit den Kopf:

Code:
#include <cstdlib>
#include <iostream>


int main (int argc, char *argv[])

{
und dann kommt der rest... ist da was falsch ?

Gruß
 

XuLo

Grünschnabel
Hi,

endlich klappt es mit der sternchen eingabe :), danke nochmal....
aber er erkennt irgendwie das passwort nicht.
Also wenn man als passwort "123" eingibt soll er das "else" ausgeben aber er schmeißt mir immer den "if" raus... hier der Quellcode wie er jetzt ist:

Code:
#include <cstdlib>
#include <iostream>
#include <windows.h>
#include <conio.h>
#include <stdbool.h>


int main ()


{ 
    char pwd[100];
    int k;
    int i= 123;
    HANDLE        hStdout;
    hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
 

    printf ("\nBitte gebe Sie das Passwort ein : ");
    while (true)
    {
      k= getch();
      
      if (k == 13)
      {
            
            break;
            
      }
      else
      {
          pwd[i] = (char)(k);
          printf ("*");
          
         
      }
}

  test:  
    if (i != 123)
    
    {
    
    printf ("\n\nDas Passwort ist FALSCH!\n");
    printf ("\nDas Programm beendet sich!\n\n\n\n");
    system ("PAUSE");

    }


    else
    main:
        {
            SetConsoleTextAttribute(hStdout, FOREGROUND_GREEN);
            printf ("\n\nDas Passwort is RICHTIG!\n\n");
            SetConsoleTextAttribute(hStdout, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
            system ("Test.xls");
           system ("PAUSE");
        }
}

oder ist die abfrage falsch ?
Schonmal Danke für die Hilfe :)

Gruß
 

deepthroat

Erfahrenes Mitglied
Hi.

Erstmal scheinst du dich jetzt entschlossen zu haben C++ statt C zu benutzen. Da brauchst du erstmal den stdbool.h Header nicht einbinden, da es in C++ wie schon erwähnt einen eingebauten Typ namens "bool" gibt und desweiteren auch "true" und "false" vordefinierte Schlüsselworte sind.

Der erste Fehler ist allerdings, das du die Variable i auf 123 setzt. Dann greifst du innerhalb der Schleife auf pwd[ i ] zu. pwd ist aber nur ein Array von 100 Zeichen. Das dein Programm da nicht abstürzt ist reiner Zufall.

Was du machen willst, ist ja die Zeichen im Array pwd zu sammeln. Dazu mußt du erstmal i auf 0 setzen und dann in der Schleife sobald du ein Zeichen gelesen hast auch inkrementieren (sonst überschreibst du immer das selbe Zeichen).

Wenn du ein Newline eingelesen hast mußt du außerdem den String in pwd terminieren - d.h. mit einem '\0' Zeichen abschliessen.

Der Test den du machst geht so schonmal gar nicht. (Der Compiler sollte eigentlich auch warnen). Du vergleichst dort einen Zeiger mit einem Integer. (das ist erlaubt aber nicht das was du willst)

Da pwd ein String ist, mußt du ihn auch wieder mit einem String vergleichen. Dazu gibt es im "cstring" Header die Funktion strcmp.

C++:
#include <cstring>

if (strcmp(pwd, "123") == 0) { // die Strings sind gleich.
  ...
} else { // pwd != "123"
  ...
}
Gruß
 

XuLo

Grünschnabel
Danke für die klasse erklärung :)
Jetzt versteh ich auch den hintergrund.. nur bei den abgleich vom passwort stimmt wohl was nich.
Also das Passwort soll "123" sein... ich geb 123 ein aber er erkennt das nicht richtig d.h. er springt zu else wo pwd eig != 123 ist. Es kann ja nur sein das er die eingabe nicht richtig speichert oder ? Hier nochmal wie es jetzt aussieht :
Code:
#include <cstdlib>
#include <iostream>
#include <windows.h>
#include <conio.h>
#include <stdbool.h>
#include <cstring>

int main ()


{ 
    char pwd[100];
    int k;
    int i= 0;
    
    
    printf ("\n\n\n\tBitte gebe Sie das Passwort ein : ");
    
    
    
    while (true)
    {
      k= getch();
      
      if (k == 13)
      {
            
            break;
            
      }
      else
      {
          pwd[i] = (char)(k);
          printf ("*");
          
         
      }
    }


    if (strcmp(pwd, "123") == 0)
    
    {
  
            printf ("\nDas Passwort is RICHTIG!\n\n");
            system ("Test.xls");
            Sleep (3000);

    
    }


    else
        {

    printf ("\n\nDas Passwort ist FALSCH!\n");
    printf ("\nDas Programm beendet sich!\n\n\n\n");
   
    system ("PAUSE");
        }  
}

(ich hab die Farbcodes mal rausgenommen :p )
Danke nochmal für die Antworten :)

Gruß
 

deepthroat

Erfahrenes Mitglied
Hi.

Du hast vergessen den pwd String zu terminieren. C-Strings haben eine unbegrenzte Länge und sind erst dann zu Ende wenn irgendwo im String binär eine 0 steht also das Zeichen '\0'.

C++:
if (k == 13) {
  pwd[i] = '\0';
  break;
}

Ach, und du inkrementierst i in der Schleife nicht. D.h. du überschreibst immer pwd[0] mit deinem gerade eingelesenen Zeichen. Du mußt i in der Schleife inkrementieren.

Gruß
 
Zuletzt bearbeitet:

XuLo

Grünschnabel
Ahh okay,

nur mit den inkrementieren klappt nich... dann muss ich doch quasi i=(0) mit einbinden also einen Festenwert zuteilen:

Code:
 while (true)
    {
      k= getch();
      
      if (k == 13)
      {
            i =( 0 );
            pwd[i] = '\0';
            
            break;
            
      }
      else
      {... //weiter

aber da sagt er mir auch noch das, dass Passwort falsch ist.

Gruß
 

SunnyBunny

Mitglied
pwd[ i ] ist ein Array.

pwd[ 0 ] = dort kommt der erste Buchstabe rein
pwd[ 1 ] = dort der Zweite.
usw.
pwd[ letzte Stelle für Buchstabe + 1 ] = "\0" für das Ende.

Du musst also jedes mal dein i um ein erhöhen, z.b. mit i++ oder i = i +1.

Gruß Sunny
 

XuLo

Grünschnabel
Mit den Array vergibt man ja den speicher (jetzt bei mir) für das Passwort oder ?
Aber ich hab nich genau verstanden wie das geht also ich würde es so machen:
Passwort soll : 123 sein , soll es dann so aussehen ?:
Code:
 while (true)
    {
      k= getch();
      
      if (k == 13)
      {
            
            pwd[0] = '1';
            pwd[1] = '2';
            pwd[2] = '3';
            pwd[i] = '\0';
            break;
            
      }
      else
      {
          pwd[i] = (char)(k);
          printf ("*");
         
          
         
      }
    }


    if (strcmp(pwd, "123") == 0)
    
    { // usw.

Ich hab das noch nie gemacht also nich böse sein wenn ich so doofe fragen stelle ...
aber macht voll spaß dahinter zu blicken :).

Gruß
 

deepthroat

Erfahrenes Mitglied
@XuLo: Wenn du nicht weißt was inkrementieren bedeutet, warum fragst du dann nicht einfach?

Dann überleg dir doch einfach mal was du dort mit deinem Code machst. Du setzt den String pwd auf "123" wenn der Benutzer die Eingabe-Taste drückt. Dann ist das Passwort doch immer "123" - völlig egal was der Benutzer vorher eingetippt hat?!

Du mußt die Zeichen im String pwd sammeln. Das heißt du willst doch eigentlich das 1 Zeichen was eingegeben wurde in pwd[0] speichern, das 2-te in pwd[1], das dritte in pwd[2] usw. bis jemand die Eingabe-Taste drückt.

Wenn du jetzt innerhalb der Schleife die Variable i nicht änderst (also inkrementierst), dann speicherst du jedes eingelesene Zeichen in pwd[0].

C++:
while (true) {
  k = getch();
  if (k == 13) {
    pwd[i] = '\0';
    break;
  } else {
    pwd[i] = k;
    i++; // <= Inkrementieren: i ist jetzt um 1 größer
  }
}
Gruß