Hilfe bei strcat error



  • Bevor mir da irgendwelche Klagen kommen, bitte

    num &= 7;
    

    an passender Stelle einfügen.



  • Oder:

    #include <stdio.h>
    
    char *getperm( char *vis, int num )
    {
    
    printf( "%d = ", num );
    
    	for( int i = 0; i < 3; i++ )
    		vis[i] = (num & 4 >> i) != 4 >> i ? '-' : i ? 'r'+4+i : 'r';
    
    	return vis;
    }
    
    int main( void )
    {
    	char vis[4] = "eop";
    	for( int i = 0; i < 8; ++i )
    		puts( getperm( vis, i ) );
    
    	return 0;
    }
    

  • Mod

    Du kannst übrigens auch direkt Zeichenkettenliterale dereferenzieren. Kein Grund, dafür einen globalen Bezeichner einzuführen:

    "rwx"[i]
    

    Oder für Extra-Obfuscation:

    i["rwx"]
    

    PS: Das ganze Problem des TE ist mit der gleichen Technik natürlich auf

    const char *getperm(int num )
    {
     static const char* perms[] = {"---", "--x", "-w-", "-wx", "r--", "r-x", "rw-", "rwx"};
     return perms[num];
    }
    

    oder in C99 gar auf

    return (const char*[]){"---", "--x", "-w-", "-wx", "r--", "r-x", "rw-", "rwx"}[num];
    

    reduzierbar.



  • Neumodischer Kram! Ich hab 1989 C gelernt (noch ohne C89 Standard damals).
    Ausserdem hat es mir heute Nacht nach 1 l Wein, 4 Halbe Bier und 3 Schnäpsen einfach Spaß gemacht 4-2-1 und 0-1-2 mit nur einer Variablen in eine Beziehung zu bringen. Und verschwurbelt sollte es natürlich auch aussehen. 🙂



  • So ich habs endlich geschafft...
    Alles was ich wollte funktioniert nun!
    Danke für eure Hilfe!!!!

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <string.h>
    
    const char *getperm(int num)
    {
    	static const char* perms[] = { "---", "--x", "-w-", "-wx", "r--", "r-x", "rw-", "rwx" };
    	return perms[num];
    }
    
    int randrecht(){
    	int rnum;
    	rnum = rand()%7;
    	return rnum;
    }
    
    int main(void){
    	srand(time(NULL));
    	char zeichen[2]={};
    	char visuel[10]={};
    	char *vergleich;
    	/*visuel = (char *)malloc(sizeof(*visuel) * 10);*/
    	vergleich = (char *)malloc(sizeof(*vergleich) * 10);
    	int eingabe;
    	int rnum;
    	int i,e;
    
    	printf("Linux-Rechte Test\n");
    	do{
    		printf("Wählen sie zwischen folgenden Möglichkeiten:\n");
    		printf("1.Test Starten\n");
    		printf("2.Beenden\n");
    		scanf("%d", &eingabe);
    
    		//generiert eine 3 stellige zufalls-zahl
    		printf("Gib die rechte für die Zahl: ");
    		for (i = 0;i < 3;i++) {
    			rnum = randrecht();
    			printf("%d", rnum);
    			strcpy(zeichen,getperm(rnum));
    			strcat(visuel,zeichen);
    		}
    		printf(" ein!\nBsp: r-xrw----\n");
    		//vergleicht antwort mit lösung
    		do {
    			scanf("%s",vergleich);
    			e = strcmp(vergleich, visuel);
    
    		} while (e != 0);
    		//ausgabe
    		printf("Eingabe korrekt\n");
    		system("pause");
    		system("cls");
    	}while(eingabe == 1);
    
    	free(vergleich);
    	free(zeichen);
    	free(visuel);
    }
    


  • Cambaru schrieb:

    So ich habs endlich geschafft...
    Alles was ich wollte funktioniert nun!
    Danke für eure Hilfe!!!!

    Ist aber falsch:

    int main(void){
    
    	srand(time(NULL));
    	char zeichen[2]={};
    	char visuel[10]={};
    	char *vergleich;
            vergleich = (char *)malloc(sizeof(*vergleich) * 10);
    ....	
    	free(vergleich); // OK
    	free(zeichen);   // ergibt UB
    	free(visuel);    // ergibt UB
    }
    

    Bei UB kann nichts passieren oder Fehlermeldung oder Systemcrash oder Katzentot oder Weltkrieg oder ...



  • Hallo Camburu!

    Wenn du mehrere Zufallszahlen hintereinander generierewn willst dann
    ist es besser eine globale Varialbe zu definieren, mit der
    du feststellen kannst ob die Funktion srand() bereits einmal
    gestartet wurde.
    Diese darf nur einmal gestartet werden im Proggi, sonst erhältst du immer
    die selben Werte. Im folgenden Beispiel ist die globale Variable initrandom,
    welche mit dem Wert Null initialisiert wird.

    int initrandom = 0;
    

    Diese Zeile würde dann in deinem Code vor randrecht() stehen

    danach kommt zum Beispiel folgende Funktion:

    //generiert Zufallszahlen von 1 bis 32767;
    int getrand (int lowerlimit, int toprange)
    {
    // bis 32767
     //srand (time (NULL));
     if (initrandom == 0)
      {
      srand (time (NULL));
      initrandom = 1;
      }
     return (rand () % (toprange + 1)) + lowerlimit;
    }
    

    mit der du Zufallzahlen von >=lowerlimit bis <= toprange generierst.

    bei

    //generiert Zufallszahlen von 1 bis 32767;
    int getrand (int lowerlimit, int toprange)
    {
    // bis 32767
     //srand (time (NULL));
     if (initrandom == 0)
      {
      srand (time (NULL));
      initrandom = 1;
      }
     return (rand () % toprange ) + lowerlimit;
    }
    

    sind es Zufallszahlen von >=lowerlimit bis < toprange.

    Übrigens kann man Zeichenfolgen, sofern diese aus einem
    eindimensionalen Array bestehen, auf wie folgt ändern:

    void getrecht(int zahl, char ergebnis[]) {
        //wandelt zahlen in visuelle zeichen
     int i;
     char vis[8][5] = {"---", "--x", "-w-", "-wx", "r--", "r-x", "rw-", "rwx" };
       for (i = 0; i <= 3; i++)
        ergebnis [i] = vis[zahl][i];
    
    }
    

    Bei dem Parameter 2 handelt es sich um ein eindimensionales Array.
    Diese kannst du praktisch in einer Funktion direkt manipulieren, anders
    als bei anderen Variablentypen, das liegt daran, wie die Adressen der
    Variable, wenn es sich um Arrays des Typs char handelt, übergeben werden.
    Aus dem Grund brauchst du auch keinen Adressoperator bei der scanf-Funktion
    angeben, falls du einen String als Variable hast, bei anderen, wie etwa
    int brauchst du das "&"-Zeichen davor.



  • rustyoldguy schrieb:

    Wenn du mehrere Zufallszahlen hintereinander generierewn willst dann ist es besser eine globale Varialbe zu definieren, mit der
    du feststellen kannst ob die Funktion srand() bereits einmal
    gestartet wurde.

    Fröstel, fröstel, rustyoldguy. Quite rusty, quite questionable.


Anmelden zum Antworten