Char zu int bzw A zu 97 (ASCII)?

3 Antworten

Dafür kannst du einfach den Char zu einem Int casten.

char myChar = 'A';
int asciiNumber = (int) myChar; // In asciiNumber steht dann 97
Woher ich das weiß:Studium / Ausbildung – Bachelor in Informatik 👨🏻‍🎓

PATA03572 
Fragesteller
 29.05.2021, 16:26

Ok verstehe. Ich muss aber ein von einem Passwort jeden Buchstaben prüfen ob in a-z ist.

0
MrAmazing2  29.05.2021, 16:27
@PATA03572

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.

0
PATA03572 
Fragesteller
 29.05.2021, 16:29
@MrAmazing2

Hm ok. Mein Passwort wird mit klar[10] eingelesen. Also z.b.

char myChar = klar[1]

0
MrAmazing2  29.05.2021, 16:29
@PATA03572
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?

0
PATA03572 
Fragesteller
 29.05.2021, 16:31
@MrAmazing2

Ja klar. Ich versteh nicht wie es mit dem einlesen meines Passwort geht

0
MrAmazing2  29.05.2021, 16:32
@PATA03572

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);
0
PATA03572 
Fragesteller
 29.05.2021, 16:34
@MrAmazing2

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

0
MrAmazing2  29.05.2021, 16:39
@PATA03572

Pseudocode für die Schleife:

for ( zähler = 0; solange zähler < 10; zähler++ ) {
  char derJeweiligeBuchstabe = klar[zähler]
 ...
}
0
PATA03572 
Fragesteller
 29.05.2021, 16:40
@MrAmazing2

So z.b. ?

char = MyChar;

int asciiNumber;

for(a=0;a>=StringLänge;a++)

{

asciiNumber = (int)klar[a];

}

0
MrAmazing2  29.05.2021, 16:41
@PATA03572

a < StringLänge

Aber ja, rest passt.

Bis auf das 'char = MyChar', keine Ahnung was das bedeuten soll x'D

1
PATA03572 
Fragesteller
 29.05.2021, 16:56
@PATA03572

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

0
PATA03572 
Fragesteller
 29.05.2021, 17:11
@PATA03572

Eigentlich sollte alles stimmen. Ich wüsste nicht was falsch ist

0
MrAmazing2  29.05.2021, 17:12
@PATA03572

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
}
0
PATA03572 
Fragesteller
 29.05.2021, 17:15
@MrAmazing2

Oh Mist. Hab ich garnicht gesehen. Funktionert jetzt :). Fettes Danke

1
PATA03572 
Fragesteller
 29.05.2021, 17:20
@MrAmazing2

Ach noch was :D Wenn ich das für Großbuchstaben ist doch einfach im Bereich von 65 bis 90

0
MrAmazing2  29.05.2021, 17:25
@PATA03572

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'.

0
MrAmazing2  29.05.2021, 17:27
@PATA03572

Bitte :D

Ich hoffe mal du kannst die If-Bedingung nachvollziehen xD

0
PATA03572 
Fragesteller
 29.05.2021, 17:46
@PATA03572

Sorry haha noch ein Problem. Ich kann dann Passwort nicht mit allen Zeichen benutzen

0
PATA03572 
Fragesteller
 29.05.2021, 17:58
@MrAmazing2

Ja das z.b. so ein Passwort akzeptiert wird: Ab5d+*h

0
PATA03572 
Fragesteller
 29.05.2021, 17:59
@MrAmazing2

Der code ist genau wie du es gezeigt hast. Aber Halt auch mit Zahlen und somderzeichen

0
MrAmazing2  29.05.2021, 17:59
@PATA03572

Vermutlich hast du da was falsch gemacht, zeig mal her dein If-Statement

0
MrAmazing2  29.05.2021, 18:02
@PATA03572

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
}
0
PATA03572 
Fragesteller
 29.05.2021, 18:28
@MrAmazing2

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)))

0
MrAmazing2  29.05.2021, 18:40
@PATA03572

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.

0
PATA03572 
Fragesteller
 29.05.2021, 18:48
@MrAmazing2

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))

0
PATA03572 
Fragesteller
 29.05.2021, 18:59
@PATA03572

Ok ich habe. War dummer Fehler :) ich brauchte die ASCII zahlen 48-57 und ich hab einfach 0-9 genommen

1
Christoph987  29.05.2021, 20:12
@PATA03572

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.

1
MrAmazing2  29.05.2021, 20:18
@Christoph987

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.

0
Christoph987  29.05.2021, 20:27
@MrAmazing2
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.

1
PATA03572 
Fragesteller
 01.06.2021, 19:03
@MrAmazing2

Hey das Programm hat grad hat grad irgend ein Problem und sagt mir sehr viele Error. Habe nichts verändert. Was kann da sein?

0

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.