[C-Programmierung] Problem mit Schleifen



  • Vielen Dank für eure schnellen Anregungen.

    Des hab ich mir auch gedacht, dass wenn ich jeden Buchstaben einzeln auf alles untersuche, ich mir merken müsste, ob z.B. schon ein Großbuchstabe dabei gewesen war.

    Habe jetzt meine große for-Schleife zu folgender Schleife umgeschrieben:
    for(c=0; c<=5;c++) //habe hier c<=5 gewählt, da "Hammer" ja 6 Buchstaben hat
    {
    if(Passwort[c]>='a'&&Passwort[c]<='z')
    b=1;
    }

    Nun funktioniert die Kleinbuchstabenanalyse.

    Wenn ich jetzt zur Großbuchstabenanalyse weitergehen will,
    muss ja mein Zeiger "Passwort" wieder auf den ersten Buchstaben des Passworts zeigen.
    Ist er nach Durchlaufen der for-Schleife immer noch auf den ersten Buchstaben gerichtet oder steht der Zeiger nun bei dem entdeckten Kleinbuchstaben?

    Ich würde mich nach wie vor freuen, wenn ihr mir weiter helfen könnt. 🙂

    Mit freundlichen Grüßen



  • In deiner Schleife veränderst du den Zeiger nicht. Nach dem Durchlauf der Schleife hat er die selbe Adresse wie vorher. Naja, den Zeiger brauchst du hier eigentlich gar nicht.
    Die Anzahl der Zeichen in der for Schleife festzulegen ist keine so gute Idee, besser ist es, auf 0 zu prüfen.

    Gruß,
    B.B.



  • Das geht auch leserlicher, wenn du Funktionen und eine Hilfsvariable benutzt:

    int i = 0, c = 0, gross = 0, klein = 0;
    	char Wort[] = "Banane";
    
    	for ( i = 0; c = Wort[i], c != 0; i++ )
    	{
    		if ( isupper(c) ) gross++;
    		if ( islower(c) ) klein++;
    	}
    


  • else if's sind da schon ganz nützlich, da ja idr. der eine fall den anderen ausschließt

    char c = 0;
        int gross = 0, klein = 0, zahl = 0, alt=0;
        char *Wort = "Banane";
        while((c = *Wort++)){
        	if(isupper(c))
        		gross++;
        	else if(islower(c))
        		klein++;
        	else if(isdigit(c))
        		zahl++;
        	else
        		alt++;
    
        }
    

    lg lolo



  • um in den coder himmel zu kommen, könnte man evtl. islower() mit isupper() tauschen, da ein passwort idr. nicht so viele zahlen und großbuchstaben enthält

    ist natürlich nur geraten 🤡

    lg lolo



  • sollte es nicht int c = 0; heißen 😕

    auf jeden fall sollte irgendwo aus dem char ein int werden, da das von den isupper(),islower(),isdigit() funktionen als parameter erwartet wird 😞



  • Vielen Dank für eure schnellen Antworten.

    Leider hab ich noch nicht so viel Erfahrung in C Programmierung und kann deshalb nicht mit allen Begriffen wie z.B. isupper, islower, isdigit etwas anfangen.

    Ich habe das Problem jetzt wie folgt gelöst:

    for(c=0; c<=LaengePasswort;c++) //habe noch eine Schleife davorgeschrieben, die analysiert wie 
    {                               //viele Zeichen das eingegebene Passwort hat
    	if(Passwort[c]>='a'&&Passwort[c]<='z')
    		b=1;
    }
    
    if(b==1)
    	Suchraum = Suchraum + 26;
    

    Ist nicht ganz so elegant wie eure Lösung,
    aber doch auch nicht so schlecht?

    Mit freundlichen Grüßen



  • Die Funktionen isupper, islower machen prinzipiell nichts anderes, als deine Zeile 13.
    Sie helfen lediglich, den Code kurz und übersichtlich zu halten.
    Achte auf deine Abbruchbedingung in der for Schleife, es genügt wenn du c < LaengePasswort schreibst.

    Hier mal eine selbstgeschriebene is_upper Funktion:

    int is_upper ( int c ) 
    {
    	return c >= 'A' && c <= 'Z';
    }
    // bzw. das gleiche in grün:
    /*
    int is_upper ( int c ) 
    {
    	if ( c >= 'A' && c <= 'Z' )
    		return 1;
    	return 0;
    }
    */
    
    int main() { 
    	char wort[] = "Ein sehr geheimes Passwort";
    	unsigned i = 0, b = 0, len = strlen (wort);
    	for ( i = 0; i < len; i++ )
    	{
    		if ( is_upper ( wort[i] ))
    		{
    			b = 1;
    			break;
    		}
    	} 
    // ...	
    	return 0;
    }
    


  • Big Brother schrieb:

    Die Funktionen isupper, islower machen prinzipiell nichts anderes, als deine Zeile 13.

    13-10 😃 🙄

    Weisst schon welche ich meine:

    if(Passwort[c]>='a'&&Passwort[c]<='z')
    

    😉 :p



  • Dankeschön für deine Hilfe.
    Die is_upper Funktion hab ich verstanden,
    da schaut des ganze gleich noch eleganter aus. 😃
    Auch vielen Dank für den Tipp, dass c < LaengePasswort auch genügt.


Anmelden zum Antworten