Strings in C



  • Hallo,

    bin grad (zwangsweise) dabei ein kleines Programm in C zu schreiben, komm' aber einfach nicht weiter.

    Es soll ein Wort eingelesen werden und dann anschliesend die vorkommenden Zeichen nach "Typklassen" der ASCII - Tabelle kategorisiert werden, so dass man dann sagen kann, ob es z.B. ein sicheres Passwort wäre...
    Man sollte nicht mit Arrays, sondern nur mit Strings und Zeigern arbeiten...

    ich dacht', ich frag mal 😉

    danke!



  • Ich seh da keine Frage. Wo hakt's denn?



  • tummy schrieb:

    ...
    bin grad (zwangsweise) dabei ...

    wehr dich, gib paroli, lass dir das nicht gefallen!!!



  • Hallo,

    ok - die Frage war etwas versteckt 😉

    Meine Frage ist: Wie kann ich auf die einzelnen eingegebenen Buchstaben/ Zahlen/ Sonderzeichen "zugreifen". Also wie kann ich überprüfen, ob diejenige Kategorie im eingegebenen Wort vorhanden ist?

    Ich würde über getchar das Wort einlesen und speichern.



  • Hast du bis jetzt schon code den du zeigen kannst?



  • tummy schrieb:

    Hallo,

    ok - die Frage war etwas versteckt 😉

    Meine Frage ist: Wie kann ich auf die einzelnen eingegebenen Buchstaben/ Zahlen/ Sonderzeichen "zugreifen". Also wie kann ich überprüfen, ob diejenige Kategorie im eingegebenen Wort vorhanden ist?

    Ich würde über getchar das Wort einlesen und speichern.

    wassn fürne kategorie? du meinst bestimmt zahlenwerte! jeder buchstabe hat je nach kodierung einen zahlenwert!

    zum balaistift:

    char c = 'a';
    if ( c == 97 ) puts ("ich bin ein kleines a !");
    

    🙂



  • tummy schrieb:

    Hallo,

    ok - die Frage war etwas versteckt 😉

    Meine Frage ist: Wie kann ich auf die einzelnen eingegebenen Buchstaben/ Zahlen/ Sonderzeichen "zugreifen". Also wie kann ich überprüfen, ob diejenige Kategorie im eingegebenen Wort vorhanden ist?

    Ich würde über getchar das Wort einlesen und speichern.

    mit getchar kannst du über stdin eine eingabe einlesen, das ist richtig. speichern geht mit getchar nicht. zum speichern brauchst du einen puffer, vorzugsweise ein char array, in das du die einzelnen zeichen kopierst.



  • <ctype.h> hat genau dafür Funktionen. In deinem Fall dürften isalpha, isdigit, iscntrl und ispunct von Interesse sein.

    Beispiel:

    #include <ctype.h>
    
    typedef enum {
      cc_letter,
      cc_number,
      cc_control,
      cc_special
    } char_category_t;
    
    char_category_t(char c) {
      if(isalpha(c)) return cc_letter;
      if(isdigit(c)) return cc_number;
      if(iscntrl(c)) return cc_control;
      return cc_special;
    }
    

    Das genaue Verhalten wird dann durch die gesetzte locale bestimmt. Umlaute beispielsweise würden bei deutscher Locale als Buchstaben erkannt, während eine englische sie vermutlich für Sonderzeichen hielte.

    Um jetzt zu prüfen, ob ein String ein Zeichen einer bestimmten Kategorie enthält, musst du halt dessen einzelne Zeichen entsprechend prüfen.



  • int main ()
    {
    char zchn = 0;
    printf("beliebiges Zeichen eingeben:");
    scanf( "%c", &zchn);
    if (zchn <= 55)
    printf("kein gültiges Zeichen") ;
    else
    printf ("ascii- zeichen");
    return 0;
    }

    also so stelle ich mir das prinzip vor. die "55" ist nur beispielhaft eingefügt...

    wenn ich aber jetzt nicht ein Zeichen eingebe, sondern ein Wort, wie kann ich überprüfen ob mind. eine Zahl oder ein kleiner Buchstabe vorkommt?



  • leycos schrieb:

    wenn ich aber jetzt nicht ein Zeichen eingebe, sondern ein Wort, wie kann ich überprüfen ob mind. eine Zahl oder ein kleiner Buchstabe vorkommt?

    Indem du die Zeichen in einer Schleife einliest und den Wert eines jeden Zeichens überprüfst.

    Gruß,
    B.B.



  • Hallo,

    herzlichen dank und entschuldige, dass ich mich so kompliziert ausdrücke, aber genau das wäre meine frage.

    also wie mache ich das?



  • du kannst jedes zeichen einzeln nacheinander mit getchar einlesen, oder alle zeichen auf einmal in ein char array mit fgets einlesen.



  • Meine ehemalige getString funktion sah so aus:

    void getString(char* buff, int buff_len){
        int i = 0, ch = 0;
    
    	if(buff == NULL || buff_len <= 0){
    		return;
    	}
    
    	/* Bis Zeilenumbruch oder Nullterminierung Schleife laufen lassen */
        for (i = 0; ((ch = getchar()) != 0x0) && (ch != 0x0A); i++)
        {
    		/* Alles >= buff_len wird verworfen */
    		if(buff != NULL && i < buff_len)
    			buff[i] = (char) ch;
        }
    
        /* Nullterminierung ans Ende setzen. */
    	if(buff != NULL)
    		buff[i] = 0x0;
    }
    

    für dich interesannt ist da der teil

    int i;
    char ch;
    /* Bis Zeilenumbruch oder Nullterminierung Schleife laufen lassen */
        for (i = 0; ((ch = getchar()) != 0x0) && (ch != 0x0A); i++)
        {
    		/* Wobei du hier nun jedes Einzelne Zeichen überprüfen kannst */
        }
    

    bzw. auch so, denke ich, das ist jetzt ungetestet .

    char ch;
    /* Bis Zeilenumbruch oder Nullterminierung Schleife laufen lassen */
        while(((ch = getchar()) != 0x0) && (ch != 0x0A))
        {
    		/* Wobei du hier nun jedes Einzelne Zeichen überprüfen kannst */
        }
    

    MFG
    Blackskyliner


Anmelden zum Antworten