Konflikte zwischen for Schleife und switch?



  • Hallo,
    ich habe eine Funktion geschrieben die ein Passwört mit x beliebigen Zahlen/Zeichen/Buchstaben erstellen soll.
    Naja hier erst mal die Funktion:

    char *rnd_pass(int len) {
      int i,x;
        char temp[MAX],*p=NULL;
           srand((time(NULL)));
    	   memset(temp,0,sizeof(temp));
    
        	     for(x=0; x<len; x++) {
    			    i = rand() % 47;
    				switch(i)  {
    				  case 0: sprintf(temp,"%sa",temp);
    					  break;
                      case 1: sprintf(temp,"%sb",temp);
    					  break;
                      case 2: sprintf(temp,"%sc",temp);
    					  break;
                      case 3: sprintf(temp,"%sd",temp);
    					  break;
                      case 4: sprintf(temp,"%se",temp);
    					  break;
    				  case 5: sprintf(temp,"%sf",temp);
    					  break;
                      case 6: sprintf(temp,"%sg",temp);
    					  break;
                      case 7: sprintf(temp,"%sh",temp);
    					  break;
    				  case 8: sprintf(temp,"%si",temp);
    					  break;
                      case 9: sprintf(temp,"%sj",temp);
    					  break;
                      case 10: sprintf(temp,"%sk",temp);
    					  break;
                      case 11: sprintf(temp,"%sl",temp);
    					  break;
                      case 12: sprintf(temp,"%sm",temp);
    					  break;
                      case 13: sprintf(temp,"%sn",temp);
    					  break;
                      case 14: sprintf(temp,"%so",temp);
    					  break;
                      case 15: sprintf(temp,"%sp",temp);
    					  break;
                      case 16: sprintf(temp,"%sq",temp);
    					  break;
                      case 17: sprintf(temp,"%sr",temp);
    					  break;
                      case 18: sprintf(temp,"%ss",temp);
    					  break;
                      case 19: sprintf(temp,"%st",temp);
    				      break;
                      case 20: sprintf(temp,"%su",temp);
    					  break;
                      case 21: sprintf(temp,"%sv",temp);
    					  break;
                      case 22: sprintf(temp,"%sw",temp);
    					  break;
                      case 23: sprintf(temp,"%sx",temp);
    					  break;
                      case 24: sprintf(temp,"%sy",temp);
    					  break;
                      case 25: sprintf(temp,"%sz",temp);
    					  break;
                      case 26: sprintf(temp,"%s0",temp);
    					  break;
                      case 27: sprintf(temp,"%s1",temp);
    					  break;
                      case 28: sprintf(temp,"%s2",temp);
    					  break;
                      case 29: sprintf(temp,"%s3",temp);
    					  break;
                      case 30: sprintf(temp,"%s4",temp);
    					  break;
                      case 31: sprintf(temp,"%s5",temp);
    					  break;
                      case 32: sprintf(temp,"%s6",temp);
    				      break;
                      case 33: sprintf(temp,"%s7",temp);
    					  break;
                      case 34: sprintf(temp,"%s8",temp);
    					  break;
                      case 35: sprintf(temp,"%s9",temp);
    					  break;
                      case 36: sprintf(temp,"%!",temp);
    					  break;
                      case 37: sprintf(temp,"%s\"",temp);
    					  break;
                      case 38: sprintf(temp,"%s@",temp);
    					  break;
                      case 39: sprintf(temp,"%s\"",temp);
    					  break;
                      case 40: sprintf(temp,"%s|",temp);
    					  break;
                      case 41: sprintf(temp,"%s?",temp);
    					  break;
                      case 42: sprintf(temp,"%s>",temp);
    					  break;
                      case 43: sprintf(temp,"%s<",temp);
    					  break;
                      case 44: sprintf(temp,"%s§",temp);
    					  break;
                      case 45: sprintf(temp,"%s&",temp);
    				      break;
                      case 46: sprintf(temp,"%s(",temp);
    					  break;
    
    				}
    				printf("x: %i\n",x); //hier zeigt er mir immer den wert von len an
    			 }
    			 printf("Temp: %s\nstrlen: %i\n",temp,strlen(temp));
    			 printf("Please press enter\n");
    			 getch();
    			 p = &temp[0];
    			 return p;
    }
    

    Das Problem ist x die Schleifen Variable zeigt mir immer x=len an.
    Aber Temp hat meistens weniger Zeichen als len z.B manchmal 36,2,11,56.
    Woran kann es den liegen?
    Kann es daran liegen das es irgendeinen Konflikt zwischen der for Schleife und switch gibt?

    Mfg



  • Hast du deinen Code mal ausprobiert?
    Also so ziemlich jeder Compiler sollte dir einen Fehler in Zeile 82 anzeigen.

    Außerdem gibst du einen Zeiger auf eine lokale Variable zurück, also würde der Rückgabewert benutzt werden kann da alles drin stehen. Also entweder temp als static anlegen oder mit malloc/free arbeiten.
    Und hast du mal was von strcat gehört?

    Zudem ließe sich deine Funktion um einiges einfacher gestalten:

    char *rnd_pass(int len)
    {
    	int x;
    	char *res = malloc(sizeof(char) * (len + 1));
    	char set[] = "abcdefghijklmnopqrstuvwxyz0123456789!\"@|?><§&(";
    
    	if (!res)
    		return NULL;
    
    	srand(time(NULL));
    
    	for (x = 0; x < len; x++)
    		res[x] = set[rand() % strlen(set)];
    	res[x] = 0;
    
    	return res;
    }
    


  • Danke.
    Wie soll ich den den Speicher deiner Funktion wieder freigegeben?
    Des geht doch gar nicht innerhalb der Funktion.
    Sry bin noch Anfänger.



  • IDontKnowTheProblem schrieb:

    Wie soll ich den den Speicher deiner Funktion wieder freigegeben?
    Des geht doch gar nicht innerhalb der Funktion.

    Ja, das ist die richtige Überlegung. Ich würde dir raten, dass der Aufrufer der Funktion selbst ein char-Array anlegt und einen Zeiger darauf an die Funktion übergibt. Dann kann der Speicher auch an der Stelle wieder freigegeben werden, wo er angefordert wurde. Alles andere verleitet nur zu Fehlern.



  • Nunja, mit free!?
    Sonst halt nen static Pointer anlegen, wobei dass natürlich nichtmehr reentrant ist und der Speicher für den Rest des Programms belegt bleibt.

    _matze's Vorschlag ist natürlich noch ein Tick besser 😉

    char * rnd_pass(int len, char *res) 
     { 
         int x; 
         char set[] = "abcdefghijklmnopqrstuvwxyz0123456789!\"@|?><§&("; 
    
         if (!res) 
             return NULL; 
    
         srand(time(NULL)); 
    
         for (x = 0; x < len; x++) 
             res[x] = set[rand() % strlen(set)]; 
         res[x] = 0; 
    
         return res; 
     }
    

    Aber denk dran, len gibt die Anzahl an Zeichen an. Die abschließende NULL braucht aber auch noch Platz.



  • Ich habe auch einen PW Creator mal geproggt:

    #include <stdio.h> 
    #include <stdlib.h> 
    #include <time.h> 
    #include <windows.h> 
    #include <string.h> 
    
    int fkt(int y) 
    { 
        return rand()%y; 
    } 
    
    int main() 
    { 
        srand(unsigned(time(NULL))); 
        int eingabe; 
        int i, x, y; 
        char zeichen[]={"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!\"§$%&/()=?`'#{}\+-*<>,.;:-_"}; 
    
        y = strlen(zeichen); 
    
        system("title Auftrag: PW Generator"); 
        scanf("%d",&eingabe); 
    
        for(i=0;i<eingabe;i++) 
        { 
           printf("%c",zeichen[fkt(y)]); 
        } 
        printf("\n\n"); 
        system("PAUSE"); 
        return 0; 
    }
    

    Grüße
    aXYZn 🙂



  • aXYZn schrieb:

    char zeichen[]={"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!\"§$%&/()=?`'#{}\+-*<>,.;:-_"};
    

    Die geschweiften Klammern drumherum brauchst du aber nicht.



  • lagalopex schrieb:

    Nunja, mit free!?
    Sonst halt nen static Pointer anlegen, wobei dass natürlich nichtmehr reentrant ist und der Speicher für den Rest des Programms belegt bleibt.

    _matze's Vorschlag ist natürlich noch ein Tick besser 😉

    char * rnd_pass(int len, char *res) 
     { 
         int x; 
         char set[] = "abcdefghijklmnopqrstuvwxyz0123456789!\"@|?><§&("; 
     
         if (!res) 
             return NULL; 
     
         srand(time(NULL)); 
     
         for (x = 0; x < len; x++) 
             res[x] = set[rand() % strlen(set)]; 
         res[x] = 0; 
     
         return res; 
     }
    

    Aber denk dran, len gibt die Anzahl an Zeichen an. Die abschließende NULL braucht aber auch noch Platz.

    Rufe die Funktion jetzt so auf:

    sprintf(buffer,"%s",rnd_pass(10,buffer));
    

    Für was die anschließende NULL?



  • Du möchtest ein Passwort mit 10 Zeichen generieren. Dann braucht dein buffer genau 11 Zeichen Platz. Nämlichd die 10 Zeichen plus das terminierende 0-Byte.
    Ist halt bei C-Strings so.

    Und ein Aufruf von:

    char buffer[11];
    rnd_pass(10, buffer);
    

    ist völlig ausreichend.


Anmelden zum Antworten