Char zu int bzw A zu 97 (ASCII)?
Wie geht das? danke !
3 Antworten
Wenn du es zu Fuß machen willst, schaust du in der ASCII-Tabelle nach.
In den meisten Programmiersprachen gibt es dafür Funktionen, wie ord oder chr.
In C sind char kleine Zahlen: "char a = 97" funktioniert. Wenn du dann a als Character ausgibst, kommt der Buchstabe 'a' heraus.
Vgl.: https://stackoverflow.com/questions/6405137/asc-and-chr-equivalent-in-c-c
Dafür kannst du einfach den Char zu einem Int casten.
char myChar = 'A';
int asciiNumber = (int) myChar; // In asciiNumber steht dann 97
Jo, dann machst du das genau so.
Per Schleife alle Buchstaben des Passworts durchgehen, die Zahl des jeweiligen Buchstaben ermitteln, und dann mit if (zahl > ... && zahl < ...) schauen, ob sie im richtigen Bereich (siehe ASCII-Tabelle, welche Zahl a hat, und welche Zahl z hat) liegt.
char myChar = klar[1]
So bekommst du den zweiten Buchstaben, ja. Aber das für alle 10 Buchstaben extra zu machen wäre unnötige Arbeit ..
Weisst du was eine Schleife ist?
Ja klar. Ich versteh nicht wie es mit dem einlesen meines Passwort geht
Achso, das hast du noch nicht?
Falls der Nutzer es eingeben soll, versuch's mal so:
char klar[10];
...
printf("Gib dein Passwort ein: ");
scanf("%s", klar);
Doch hab ich xD. Ich meine das; bei dir oben steht ja char myChar = 'A'. Wie Picke ich von meinem Passwort die einzelnen Buchstaben raus und wandle sie um
Pseudocode für die Schleife:
for ( zähler = 0; solange zähler < 10; zähler++ ) {
char derJeweiligeBuchstabe = klar[zähler]
...
}
So z.b. ?
char = MyChar;
int asciiNumber;
for(a=0;a>=StringLänge;a++)
{
asciiNumber = (int)klar[a];
}
a < StringLänge
Aber ja, rest passt.
Bis auf das 'char = MyChar', keine Ahnung was das bedeuten soll x'D
printf("Passwort eingeben:"); gets(klar);
for(a=0;a<len;a++)
{
NEU = (int)klar[a];
for(z=97;z<=122;z++)
{
if(NEU != z)
{
printf("\nUngueltige Zeichen verwendet!");
printf("\nBitte erneut eingeben:");
gets(klar);
len = strlen(klar);
}
}
Sorry für die Formatierung
Eigentlich sollte alles stimmen. Ich wüsste nicht was falsch ist
Du prüfst den Bereich falsch. Das hier ist dein Code, um zu prüfen, ob ein Buchstabe (NEU) zwischen a und z liegt:
for(z=97;z<=122;z++)
{
if(NEU != z)
{
Angenommen du gibst b ein, also 98.
Dann wird NEU != z die ganzezeit true sein, ausser wenn z 98 ist. Folglich wirft er dir dann 25 mal den Fehler raus, und nur das eine mal ist es true.
Was du brauchst ist ein einfaches
if (NEU < 97 || NEU > 122) {
... //Fehler ausgeben
}
Oh Mist. Hab ich garnicht gesehen. Funktionert jetzt :). Fettes Danke
Ach noch was :D Wenn ich das für Großbuchstaben ist doch einfach im Bereich von 65 bis 90
Jo. ^^
if (NEU < 65 || NEU > 90) {
... //Fehler ausgeben
}
So machst du's , falls es ein Großbuchstabe sein muss.
Falls es ein Großbuchstabe oder ein Kleinbuchstabe sein darf, dann musst du die zwei Ifs verbinden (sonst wird dir immer ein Fehler ausgegeben):
if ((NEU < 65 || NEU > 90) && (NEU < 97 || NEU > 122)) {
... //Fehler ausgeben
}
Also 'Wenn Nicht Großbuchstabe UND Nicht Kleinbuchstabe, dann Fehler'.
Sorry haha noch ein Problem. Ich kann dann Passwort nicht mit allen Zeichen benutzen
Ja das z.b. so ein Passwort akzeptiert wird: Ab5d+*h
Der code ist genau wie du es gezeigt hast. Aber Halt auch mit Zahlen und somderzeichen
Vermutlich hast du da was falsch gemacht, zeig mal her dein If-Statement
Buchstaben, Zahlen und Sonderzeichen, das ist doch dann eigentlich der komplette Bereich von 32 bis 126, oder nicht?
if (buchstabe < 32 || buchstabe > 126) {
.. fehler ausgeben
}
Ich hab was geändert. Ich glaub es funktioniert jtz. Habe das so :
if ( NEU<65 || Neu>122) || ((NEU < 65 || NEU > 90) && (NEU < 97 || NEU > 122)))
Das wird nich funktionieren, das ändert absolut nichts...
Machs doch mal systematisch, und nicht mit raten...
Folgendes hast du schon:
(NEU < 65 || NEU > 90) : Keine Großbuchstabe
(NEU < 97 || NEU > 122) : Kein Kleinbuchstabe
Was fehlt noch:
- Kein * + , - .
- Kein !
- Kein # $ % &
- Kein ?
Also:
(NEU < 42 || NEU > 46) : Kein * + , - .
(NEU != 33) : Kein !
(NEU < 35 || NEU > 38) : Kein # $ % &
(NEU != 63) : Kein ?
Jetzt nurnoch alle mit UND verbinden. Also auf Deutsch:
WENN (Zeichen ist kein Großbuchstabe UND Zeichen ist kein Kleinbuchstabe UND Zeichen ist kein * + , - . UND Zeichen ist kein ! UND Zeichen ist kein # $ % & UND Zeichen ist kein ?) DANN Fehler ausgeben weil ungültig.
So siehts as:
if((NEU1!=33) && (NEU1<35 || NEU1>38) && (NEU1<65 || NEU1>90) && (NEU1<97 || NEU1>122) && (NEU1<0 || NEU1>9) && ( NEU1<42 || NEU1>46) && (NEU1!=63))
Ok ich habe. War dummer Fehler :) ich brauchte die ASCII zahlen 48-57 und ich hab einfach 0-9 genommen
Du kannst auch statt z.B. 48 einfach '0' schreiben. Du musst das auch nicht in ein int umwandeln, sondern kannst direkt klar[a] mit den entsprechenden Zeichen vergleichen. Zudem geht die Umwandlung in int auch implizit, also ohne das (int) davor.
Würd aber trotzdem empfehlen es immer explizit (also mit (int) davor) umzuwandeln, der Übersichtlichkeit & Verständlichkeit halber.
Aber das mit '0' usw.ist eine gute Idee, ja, das macht das ganze etwas übersichtlicher, danke für die Ergänzung.
Würd aber trotzdem empfehlen es immer explizit (also mit (int) davor) umzuwandeln, der Übersichtlichkeit & Verständlichkeit halber.
Für sowas gibt es Compilerwarnungen. Also falls du z.B. long long (64 Bit) in int (32 Bit) umwandelst. Ansonsten ist es relativ egal, da keine Daten verloren gehen.
Wenn man die Variablen dort deklariert, wo sie auch initialisiert werden, statt alle am Anfang, dann ist es sogar noch übersichtlicher und man kann nicht aus Versehen nicht-initialisierte Variablen verwenden.
Hey das Programm hat grad hat grad irgend ein Problem und sagt mir sehr viele Error. Habe nichts verändert. Was kann da sein?
In C geht das ganze aufgrund von "alles ist eine Zahl" ohne weitere Dinge implizit.
int x = 'x';
P.S.: A wäre allerdings 65, um 97 zu erhalten müsstest du schon a nehmen.
Ok verstehe. Ich muss aber ein von einem Passwort jeden Buchstaben prüfen ob in a-z ist.