Buchstaben in Zahlen umwandeln mit C



  • Hallo.

    Ich bin noch ein Anfänger, möchte aber nach den Sternen greifen. Für eines meiner aktuellen Projekte muss ich Bustaben in Zahlen umwandeln.

    Das heißt, ich scanne z.B. ein "a" und dann wird in eine Variable die Zahl "1" reingeschreiben. Wenn ich ein "b" eingebe eine 2 usw.

    Buchstaben oder Wörter scannen ist für mich kein Problem.
    Leider funktioniert für das umwandeln soetwas banales wie:

    if (Eingabe == a)
    

    oder:

    switch (Eingabe)
          case k:
    

    Das Ultimativste wäre, wenn man zum Beispiel "test" eingibt und dann entweder einer Variabeln (wenn das geht) oder 4 Variablen 20,5,19,20 zugewiesen werden.

    Wäre schön, wenn ihr mir ausführlich helfen könntet.

    mfg

    Moorhahn



  • Soweit ich weiß, kann man einen Char direkt in einen Integer umwandeln. Dabei müsstest du dir zwar noch ein paar Kleinigkeiten überlegen, aber das dürfte nicht schwer sein.
    Sofern du deine Eingabe mit Hilfe von scanf erfolgen lässt, dürfte diese Umwandlung sogar ganz kurz zu fassen sein:

    int Eingabe;
    scanf("%d" , &Eingabe);
    

    Nun hast du ein beliebiges ASCII-Zeichen eingegeben, in der Variable Eingabe wird aber die entsprechende Position im ASCII-Code gespeichert. Für ein großes A sollte dein int also den Wert 65 haben, für ein kleines eine 96.
    Wendest du nun ein paar if's an, bekommst du die Zahlen schnell umgewandelt:

    if(Eingabe < 96)
    {  Eingabe-=64;
    }
    if(Eingabe >=96)
    {  Eingabe-=95;
    }
    

    Da es im ASCII-Code noch viele Zeichen mehr gibt, könntest du mit einem switch und ein paar solcher Fallunterscheidungen dein Alphabet nummerieren :).

    Übrigens habe ich die Quelltexte nicht getestet - da ich selbst noch Anfänger bin, kann es sein, dass du z.B. bei scanf noch einen Umweg gehen musst. Das sähe dann so oder ähnlich aus:

    int Eingabe;
    char Puffer;
    scanf("%s" , &Puffer);
    Eingabe = Puffer;
    

    Willst du ein Wort eingeben, muss dein char zum Array werden, falls du C++ benutzt, gibt es vermutlich auch einen String.

    int Eingabe;
    char Puffer[20];     //Das Array kann jetzt 20 Zeichen fassen.
    scanf("%s" , &Puffer);
    

    int i;
    for(i=0 , i<20 , i++)
    {  Eingabe = Puffer[i];
       printf("%i," , Eingabe);
    }
    

    Willst du das letzte Komma bei deiner Zahlenfolge umgehen, bau noch eine if-Abfrage in die Schleife oder denk dir was hübscheres aus :).



  • Stiefel2000 schrieb:

    für ein kleines [a] eine 96.

    97...

    char c;
    int i;
    printf("Buchstabe eingeben: ");
    if(scanf("%c",&c)>0) {
    	if(c>='A' && c<='Z') {
    		i=c-'A'+1;
    	}else if(c>='a' && c<='z') {
    		i=c-'a'+1;
    	}else {
    		//falsche Eingabe
    	}
    }
    

    So in etwa?



  • Stiefel2000 schrieb:

    Nun hast du ein beliebiges ASCII-Zeichen eingegeben, in der Variable Eingabe wird aber die entsprechende Position im ASCII-Code gespeichert. Für ein großes A sollte dein int also den Wert 65 haben, für ein kleines eine 96.
    Wendest du nun ein paar if's an, bekommst du die Zahlen schnell umgewandelt:

    ich weiß, dass es total 1337 aussieht, wenn man die ASCII Codes hardcodet... mach es aber trotzdem nicht! Es ist 1. wenig lesbarer, 2. Menschen machen Fehler, der Compiler macht auch 'a' schon das richtige daraus.

    Also, keine ASCII Code hardcoden, auch wenn es total 1337 aussieht.



  • Erstmal ein riesengroßes Danke.
    Für schnelle und hilfreiche Antworten.

    Willst du ein Wort eingeben, muss dein char zum Array werden, falls du C++ benutzt, gibt es vermutlich auch einen String.

    C/C++ Code:
    int Eingabe;
    char Puffer[20]; //Das Array kann jetzt 20 Zeichen fassen.
    scanf("%s" , &Puffer);
    C/C++ Code:
    int Eingabe;
    char Puffer[20]; //Das Array kann jetzt 20 Zeichen fassen.
    scanf("%s" , &Puffer);
    C/C++ Code:
    int Eingabe;
    char Puffer[20]; //Das Array kann jetzt 20 Zeichen fassen.
    scanf("%s" , &Puffer);

    C/C++ Code:
    int i;
    for(i=0 , i<20 , i++)
    { Eingabe = Puffer[i];
    printf("%i," , Eingabe);
    }
    C/C++ Code:
    int i;
    for(i=0 , i<20 , i++)
    { Eingabe = Puffer[i];
    printf("%i," , Eingabe);
    }
    C/C++ Code:
    int i;
    for(i=0 , i<20 , i++)
    { Eingabe = Puffer[i];
    printf("%i," , Eingabe);
    }

    Das habe ich schonmal verstanden. Das hilft schon sehr.
    Bloß beim Rest haperts.
    stiefels Erklärung kann ich kaum umsetzen.
    Das ist wohl zu abgehackt, sorry.
    matzes habe ich mal getippt, bekomme aber "misplaced else" fehler bei beiden elses:
    wer weiß eine lösung:

    # include <stdio.h>
    # include <conio.h>
    # include <stdlib.h>
    # include <math.h>
    
    main ()
    
    {
    char c;
    int i;
    	printf ("Buchstabe eingeben");
    	if (scanf ("%c",&c)>0);
    	{
    		if (c>='A'&& c<='Z');
    		{
    
    		 	i=c-'A'+1;
    		}
    		else
    
    			if (c>='a'&&c<='z');
                   		{
    				i=c-'a'+1;
    			}
    			else
                            { 
    				printf ("Falsche Eingabe");
    			}	  
    
    	}
    }
    

    supertuxs Beitrag sagt mir garnichts.
    Sorry bin wohl zu anfängerhaft.

    mfg



  • Bitte übernimm mein Beispiel mal ganz genauso, wie es da steht, dann klappt es auch. Du hast da einiges falsch abgetippt. Beim ersten else fehlt die Klammer, beim darauf folgenden if hast du ein Semikolon dahintergeklatscht (was zur Folge hat, dass das eine leere if-Anweisung ist!)...

    Außerdem ist deine Einrückung... na ja, seltsam. 😉 Es gibt da verschiedene Varianten. Ich bevorzuge die von mir gezeigte (welch Wunder 😉 ), du kannst das gerne etwas anders machen. Aber so, wie du es gemacht hast, ist es nicht stimmig. Stell dir einfach vor, dein Code ist 10000 Zeilen groß. Da geht jeglicher Überblick, wann ein Block anfängt oder endet, verloren... Also: Blockanfang und Blockende (meist an den geschweiften Klammern zu erkennen) sollten immer auf einer vertikalen Linie sein.

    supertux meint nur, dass man statt 65 lieber 'A' schreiben sollte (sofern man sich halt auf das ASCII-Zeichen beziehen möchte), um die Lesbarkeit zu erhöhen und die Fehleranfälligkeit zu verringern.



  • ok.. hat geklappt danke.
    wenn ich jetzt statt einem buchstaben ein array verwende, muss ich ja nur den schritt für jeden buchstaben im array widerholen...
    doch wie weiß ich, wie oft ich es wiederholen muss.

    wenn ihr wollt, könnt ihr es auch gleich mit einem satz versuchen:
    Leerzeichen sollte 0 werden
    "dies ist ein test"
    geht das auch mit arrays??
    also, dass dann da steht:
    4,9,5,...

    mfg



  • Sorry, das meine Hinweise zu "abgehackt" erschienen. Vielleicht habe ich deine Programmier-Fähigkeiten leicht überschätzt ;). Ich war nämlich der Meinung, dass du dir mit den Brocken was schönes zusammenbauen kannst.

    Aber zu deinem Problem: Wenn du einen String (also ein Char-Array) hast, dann steht in deinem Array am Ende GENAU dies drin:
    "dies ist ein test\0"
    Das Steuerzeichen "\0" zeigt an, wo der String zu ende ist (unabhängig davon, wie groß dein Char-Array eigentlich ist!). Willst du also jedes Zeichen in deine Zahl "übersetzen", dann könntest du z.B. eine for- oder while-Schleife nehmen.

    Übrigens glaube ich, dass das Leerzeichen im ASCII-Code mit der 32 versehen ist, da bin ich allerdings nicht sicher. Beim kleinen a habe ich ja auch daneben gelegen ;).

    char c[50];
    int i,k;
    printf("Satz eingeben: ");
    scanf("%s", & c);
    for(i=0 ; c[i] != '\0' ; i++)
    {
       if(c[i]>='A' && c[i]<='Z') 
          k=c[i]-'A'+1;
       if(c[i]>='a' && c[i]<='z') 
          k=c-'a'+1;
       if(c[i]==' ')
          k=0;
       if(c[i]<32 || (c[i]>32 && c[i]<65) || (c[i]>90 && c[i]<97) || c[i]>122)
          continue;    //ist ein Sonderzeichen vorhanden, wird es übersprungen
       if(c[i+1]!='\0')
          printf("%i, " , k);
       else
          printf("%i" , k);
    }
    

    Ich habe leider gerade nichts zum Ausprobieren, es sind vielleicht noch kleine Fehler enthalten. Aber das sollte nichts sein, das sich nicht austesten lässt :).



  • Stiefel2000 schrieb:

    Übrigens glaube ich, dass das Leerzeichen im ASCII-Code mit der 32 versehen ist, da bin ich allerdings nicht sicher. Beim kleinen a habe ich ja auch daneben gelegen ;).

    Diesmal stimmt's. 😉

    Aber sag mal, warum schreibst du jetzt manchmal 'A' und manchmal 65? Entweder oder, aber mischen sollte man das nicht. Da geht die Lesbarkeit wirklich komplett den Bach 'runter... 🙂



  • _matze schrieb:

    Aber sag mal, warum schreibst du jetzt manchmal 'A' und manchmal 65? Entweder oder, aber mischen sollte man das nicht. Da geht die Lesbarkeit wirklich komplett den Bach 'runter... 🙂

    Ach ja, das liegt daran, dass ich als Grundlage erstmal deinen Quelltext von oben kopiert und ihn dann abgeändert habe - beim Selbstschreiben war mir wohl der Gedanke lieber, bei den Operatoren für Zahlen auch Zahlen zu sehen :). Aber du hast natürlich Recht, da sollte man die Form einhalten.



  • Stiefel2000 schrieb:

    _matze schrieb:

    Aber sag mal, warum schreibst du jetzt manchmal 'A' und manchmal 65? Entweder oder, aber mischen sollte man das nicht. Da geht die Lesbarkeit wirklich komplett den Bach 'runter... 🙂

    Ach ja, das liegt daran, dass ich als Grundlage erstmal deinen Quelltext von oben kopiert und ihn dann abgeändert habe - beim Selbstschreiben war mir wohl der Gedanke lieber, bei den Operatoren für Zahlen auch Zahlen zu sehen :). Aber du hast natürlich Recht, da sollte man die Form einhalten.

    Ich nehm auch lieber Zahlen, aber ich muss zugeben, dass für viele die Buchstaben einfach lesbarer sind. Deshalb versuche ich, mich im Forum daran zu halten... 🤡


Anmelden zum Antworten