[C] swich mit Wort

walter33331 schrieb:
Gibt es den einen allgemeinen definierten Befehl, um in [C] den Tastaturbuffer zu leeren?
Nein, den gibt es nicht. Die Gegenfrage lautet, warum sollte man das wollen? I.d.R. ist das in einem Missverständnis von formatiertem und unformatiertem Input begründet.
 
@7H3 N4C3R
walter33331 schrieb:
Ist manch mal noch hilf reich, wenn ich im Programm mehrere oder eine Eingabe habe und dann nach der Ausgabe ein getchar() mache. Mit fflush(stdin) muss ich nur ein getchar() sonst muss ich zwei machen.


Wegen dem oder mache ich da etwas falsch beim Hacken?:confused_alt:
 
Beim Hacken brauchst du vor allem eine gute Axt. ;)

Das getchar() soll auf eine Anwendereingabe warten? Oder "nach" Programmende noch auf einen Tastendruck warten?
Es ist eine Fehlannahme, dass die Standardeingabe (stdin/cin) die Tastatur ist. Unter Linux ist es z.B. gang und gebe eine Datei oder die Ausgabe eines Programms an das nächste zu pipen.
Und dann kommen wir schon zu fflush(stdin). Das macht irgendwas. Nix definiertes. Wenn es tatsächlich den Eingabepuffer leert, ist das ein riesiges Problem!
Das Ding heißt nicht umsonst Puffer. Angenommen wir haben noch die Tastatur angeschlossen und der Anwender hackt fleißig seine Daten rein. D.h. nach dem Beendenden \n stehen schon weitere Daten im Puffer. Nun machst du ein fflush(stdin) und schon sind die Daten, die der Anwender gerade eingegeben hat fott. Obwohl sie absolut sinnvoll waren.
Noch schlimmer wird es, wenn eine Datei an der Standardeingabe hängt. Dann ist der Eingabepuffer ständig mehr oder minder gefüllt und es kommt zu nicht reproduzierbarem Datenverlust.

Wenn du tatsächlich am Ende eines Konsolenprogramms auf einen Tastendruck warten willst, dann starte das Programm aus einer Shell heraus und bau irgendwelche Abfragen aus.
 
Ich habe so wie gemacht wie BerniG gesagt hat nur das problem bei jeder antwort kommt immer richtig was habe ich falsch gemacht hier mein code:

Code:
#include <stdio.h>


int main()
{

    char antwort[10];
    printf("Welches Land hat die meißten Einwohner?\nAntwort:"); /*die Frage*/
    scanf ("%s", &antwort);   /*s nimmt eine zeichenkette auf*/

    int str1;

    str1= "China";
    if(strcmp(str1, "China") == 0)
    {
        printf("\nrichtig\n");
    }

    else if(strcmp(str1, "USA") == 0)
    {
        printf("\nfalsch\n");

    }

    else
    {
        printf("\nfalsch");

    }

   printf("Antwort:%s\n", &antwort);
 
    return 0;
}
 
Code:
#include <stdio.h>


int main()
{

    char antwort[10];
    printf("Welches Land hat die meißten Einwohner?\nAntwort:"); /*die Frage*/
    scanf ("%s", &antwort);   /*s nimmt eine zeichenkette auf*/

    [B]int[/B] str1;

    str1= "China";
    if(strcmp(str1, "China") == 0)
    {
        printf("\nrichtig\n");
    }

    else if(strcmp(str1, "USA") == 0)
    {
        printf("\nfalsch\n");

    }

    else
    {
        printf("\nfalsch");

    }

   printf("Antwort:%s\n", &antwort);
 
    return 0;
}

Du definierst einen String als Integer!

Edit:

Außerdem belegst du str1 mit China und checkst dann ob China oder USA drin steht.
Das macht keinen Sinn!
Wenn du checken willst ob der Benutzer China oder USA eingegeben hat, dann musst du die Eingabe checken und nicht str1.

Gruß
BlackMark
 
Zuletzt bearbeitet:
Genau. Alles mit str1 weg und dafür beim strcmp "antwort" als Variable anstatt str1 einsetzen. Ich habe ja nur ein allgemeines Codebeispiel gepostet.
 
Danke ich habe es geändert und es klappt jetzt gut. Vielen Dank!

Wie kann man das Programm automatisch in den Autostart einfügen. Also das Programm soll automatisch in den hkey und auch wieder entfernt werden.
 
Zuletzt bearbeitet:
Hier ein Beispiel wie du was in den Autostart schreibst und wieder entfernst:
Code:
#include <windows.h>
#include <stdio.h>

BOOL WriteReg( HKEY key, char *place, char *name, char *Value )
{
	HKEY hkey;

	if( (RegOpenKeyEx(key, place,0, KEY_ALL_ACCESS,&hkey)) != ERROR_SUCCESS )
		return FALSE;

	if( (RegSetValueEx(hkey, name, 0, REG_SZ, (BYTE *)Value, strlen(Value))) != ERROR_SUCCESS )
		return FALSE;

	if( (RegCloseKey(hkey)) != ERROR_SUCCESS )
		return FALSE;

	return TRUE;
}

BOOL DeleteReg( HKEY key, char *place, char *name )
{
	HKEY hKey;

	if( (RegOpenKeyEx(key, place,0, KEY_ALL_ACCESS,&hKey)) != ERROR_SUCCESS )
		return FALSE;

	if( (RegDeleteValue(hKey, name)) != ERROR_SUCCESS )
		return FALSE;

	if( (RegCloseKey(hKey)) != ERROR_SUCCESS )
		return FALSE;

	return TRUE;
}

int main() 
{
	HKEY KEY = HKEY_LOCAL_MACHINE; 
	char place[] = {"Software\\Microsoft\\Windows\\CurrentVersion\\Run"};
	char name[] = {"Notepad"}; 
	char Value[] = {"C:\\WINDOWS\\notepad.exe"};

	BOOL WriteSuccess;
	BOOL DeleteSuccess;

	printf("Writing to registry . . .\n\n");

	WriteSuccess = WriteReg( KEY, place, name, Value );

	if( WriteSuccess == TRUE )		
		printf("NO ERRORS OCCURRED!\n");
	else		
		printf("AN UNKNOWN ERROR OCCURRED!\n");

	printf("\nDeleting from registry . . .\n\n");

	DeleteSuccess = DeleteReg( KEY, place, name );

	if( DeleteSuccess == TRUE )		
		printf("NO ERRORS OCCURRED!\n");
	else		
		printf("AN UNKNOWN ERROR OCCURRED!\n");

	return 0; 
}

In der Variable Name steht der Name des Keys der erzeugt wird und in Value steht der Wert.

Du musst mit der Advapi32.lib linken und du könntest probleme mit ANSI und UNICODE bekommen.
Das beispiel hier ist ANSI, also wenn dein compiler auf UNICODE ist bekommst du fehler!

Gruß
BlackMark
 
Ich weiß nicht so richtig was ich für "Name " und "Value"(Ich weiß nicht was der Wert ist!Ist das der Pfad??) einsetzen soll.
Könntest du vielleicht ein Beispiel oder Erklärung geben? Das wär echt nett.
 
Bei Name ( wo jetzt Notepad drinnen steht ) kannst du rein schreiben wie der Key heißen soll der in der Registry erzeugt werden soll,
in den meisten fällen wäre das dann der Name des Programmes.
In Value kommt der Pfad des Programmes ( in dem Fall der Pfad des Notepads ).

Gruß
BlackMark
 
Ah ich hab es verstanden. Ich habe den einen Teil total überlesen. Wenn irgendjemand anders sich z.b. das Programm in internet runterlädt. Dann weiß ich als programmierer nicht den Pfad des Programmes. Wie mache ich das dann?
 
Den Pfad des Programmes bekommst du so:
Code:
#include <windows.h>
#include <stdio.h>

int main ()
{
	TCHAR path[MAX_PATH];
	GetModuleFileName(NULL, path, MAX_PATH);
	printf("The path is: %s\n", path);
	
	return 0;
}

Wenn der compiler TCHAR nicht kennt musst du noch den tchar.h includieren.
MAX_PATH sollte im windows.h definiert sein.

Edit:

Alternativ dazu kannst du das auch mit den Argumenten von main machen, also:
Code:
#include <windows.h>
#include <stdio.h>

int main( int argc, char **argv )
{
	printf("The path is: %s\n", *argv);
	
	return 0;
}

Gruß
BlackMark
 
Zuletzt bearbeitet:
Nochmal zum eigentlichen Thema eine if anweisung mit String. Bei klappt alles mit if und String und eine frage habe ich noch zu diesem Thema. Wie kann ich das ganze mit 2 oder mehr Bedingungen machen?
So klappt es bei mir sehr gut:
Code:
 if(strcmp(passwort , "password") == 0)

Nur jetzt will ich das ganze mit einer zweiten Bedingung also sowas z.bsp:(hat leider nicht funktioniert:
Code:
 if(strcmp(passwort , "password") == 0) && if(strcmp(Benutzername , "Murphy) == 0)

Wie muss ich das machen, das beide bedingungen erfüllt sein müssen??
 
Du kannst in if mit && und || beliebig viele bedingungen machen.
Aber in if noch ein if geht nicht!

So müsste es aussehen:
Code:
if(strcmp(passwort , "password") == 0 && strcmp(Benutzername , "Murphy") == 0)

Gruß
BlackMark
 
Zuletzt bearbeitet:
Bei dir stimmt was mit den Klammern ned. Ich würde die Klammern so setzen:
Code:
if((strcmp(passwort , "password") == 0) && (strcmp(Benutzername , "Murphy") == 0))
Folgendes geht auch aber ich finde obiges Übersichtlicher:
Code:
if(strcmp(passwort , "password") == 0 && strcmp(Benutzername , "Murphy") == 0)
Übrigens: C interpretiert 0 als "falsch" und alles andere als "wahr". Daher könnte man auch Folgendes machen (das Ausrufezeichen dreht das Ganze praktisch um, so dass "falsch" zu "wahr" und "wahr" zu "falsch" wird):
Code:
if(!strcmp(passwort , "password") && !strcmp(Benutzername , "Murphy"))
 
Zuletzt bearbeitet:
@BerniG danke klappt so bei BlackMark ging es nicht. Aber danke für eure hilfe.
 
Zuletzt bearbeitet:
@BerniG:
Bei zwei Argumenten ist es komplett egal ob man Klammern setzt oder nicht!

Ja mein Code war falsch da die Klammern falsch gesetzt waren und bei Murphy das zweite " gefehlt hat.
Das übrigens auch bei BerniG fehlt :D

Gruß
BlackMark
 
Bei zwei Argumenten ist es komplett egal ob man Klammern setzt oder nicht!
Hab auch nichts Anderes behauptet sondern nur gesagt, dass ichs Übersichtlicher finde.

Das fehlende Anführungszeichen hinter "Murphy" hab ich grad mal ergänzt aber Murphy7 hats ja eh schon hinbekommen...
 
Hab mein Beispiel jetzt auch korrigiert.

@BerniG:
Hast schon recht, es ist wirklich übersichtlicher.
Außerdem würde ich sowieso statt == 0 das ! verwenden, da das nochmal übersichtlicher ist.

Gruß
BlackMark
 
Ich versteh das mit hkey irgendwie immer noch nicht richtig könntest du mir es in Beispiel verpacken habe ihr ein simple passwortabfrage:

Code:
#include <stdio.h>
#include <windows.h>

int main()
{
    char name[10], passwort[10];
    do
    {

    printf("Willkommen an ihrem Pc!\nBitte Loggen Sie sich ein!\nBenutzername:");
    scanf ("%s", &name);
    printf("Passwort:");
    scanf("%s", &passwort);

    if((strcmp(passwort , "password") == 0) && (strcmp(name , "Moritz") == 0))
        {
        printf("\nHerzlich willkommen %s\n", &name);
        Sleep(1000);/*macht eine pause für 1s = 1000ms*/
        }
     else
        {
        printf("\n\aBenutzername oder Passwort falsch!\n\n");
        Sleep(1000);
        system("cls");/*löscht den vorigen Prozess,sodass es aussieht ob es von vorne startet*/
        }

    }
    while (strcmp(passwort , "password") != 0);
    return 0;
}

Es soll immer beim Start wenn ich auf den Desktop komme starten.
Das programm heißt übrigens passwortschutz.exe. Wenn du das verwenden kannst verstehe ich es vielleicht besser.
 
Zurück
Oben