myGully.com

myGully.com (https://mygully.com/index.php)
-   Programmierung (https://mygully.com/forumdisplay.php?f=67)
-   -   Zufallstexte C (https://mygully.com/showthread.php?t=2891288)

Schnidlwuz 05.04.13 19:19

Zufallstexte C
 
So guten abend ersteinmal,

unten ist der ausschnitt einer von mir geschriebenen funktion (die kommentare wurden vom aufgabenbetreuer als hilfestellung gegeben).

Was die funktion im moment macht steht schon dabei lediglich die letzten 2 schritte fehlen, und bei denen weiß ich nicht weiter.

Was die funktion eigentlich machen sollte wenn sie fertig ist:
Die funktion soll einen (speichereffizienten // malloc) Puffer mit einer zufälligen anzahl (1-MAXLEN) zufälliger Buchstaben (A-Z) füllen.

MEIN PROBLEM: Wie schaffe ich es die generierten buchstaben in einen string zu schreiben, dh. den string durch die ergebnisse der for schleife zu füllen?
Ich denke mal dass soll auch der kommentar des Aufgabenstellers bedeuten:
Code:

//char* zufallsstring


    //return zufallsstring

Ein weiteres Problem ist, ich studiere nicht informatik sondern e-technik und wir haben viel zu wenig informatik vorlesungen also ist das meiste selbst angelernt also falls jemand so nett ist und erklärungen schreibt bitte so dass es auch C-anfänger verstehen ;)


Die nächste aufgabe wird dann in die main geschrieben:
Die Funktion zur generierung der zufälligen zeichenkette, also der inhalt des puffers soll mehrmals neu beschrieben werden wobei dessen ergebnisse in einem array abgespeichert werden. (Hier benötige ich eigentlich keine hilfe ich denke mal das funktioniert einfach mit strcpy(array string); wobei ich mir auch nicht ganz sicher bin wie ich dass anstelle weil der puffer ja in einer anderen funktion sitzt, also evtl. mit einem pointer)



Code:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#define MAXLEN 5
#define CHAR 26


char *zufall ()
{

    srand(time(NULL));

    //variablen

    int zufallszahl;
    int i;
    char zufallschar;

    //generiere zufallszahl im bereich von - bis -> mit Modulo

    zufallszahl = rand() % MAXLEN +1;


    //for-schleife -> iteriere bis zufallszahl -> zufallscharacter mit modulo

    for(i=1; i<=zufallszahl; i++)
    {

        char zufallschar = 64 + (rand() % CHAR +1);

    }


    //char* zufallsstring


    //return zufallsstring



    }


Über Hilfe würde ich mich riesig freuen ich glaube ich sitze schon mehrere stunden davor und komm nicht weiter :(

urga 05.04.13 20:31

eine mögliche (std C) lösung:
PHP-Code:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <assert.h>


charrndstring (charbufint length) {
        
int i;
        
assert (length 512);
        for (
i=0lengthi++) {
                
buf[i] = 64 + (rand() % 10);
        }
        
buf[i] = '\0';
        return 
buf;
}

main() {
        
char buf[512];
        
srand(time(NULL));
        
printf ("%s\n"rndstring (buf10));


die konstanten müssten noch per #define definiert werden.

Schnidlwuz 05.04.13 22:02

oh vielen dank :)!
allerdings kann ich mit assert () nichts anfangen zumal es auch noch nicht behandelt wurde und wahrscheinlich auch gar nicht wird. Kann man das auch anders lösen?

Your_Conscience 05.04.13 22:05

Ja die Zeile kannst du rauslöschen, oder besser durch ein if ersetzen.

Partyanne 05.04.13 23:10

...weil ich gerade string.h sehe.

c oder c++?

ansonsten kannst du ja auch die string-klasse nutzen.

Schnidlwuz 06.04.13 01:46

C, C++ kommt erst noch ;)

Schnidlwuz 06.04.13 12:42

So also die Ausgabe stimmt zu 90 % dh. es ist eine zufällige anzahl (1 bis MAXLEN) zufälliger buchstaben. Allerdings ist das erste Zeichen immer ein: °

Hängt wahrscheinlich mit dieser warnung zusammen?:

warning: passing arg 1 of `zufall' makes pointer from integer without a cast

Code:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#define MAXLEN 5
#define CHAR 26

char* zufall (char* buf)
{



    /**** VARIABLEN ****/

    int zufallszahl;
    int i;



    /**** GENERIERUNG DER ZUFALLSZAHL ****/

    zufallszahl = rand() % MAXLEN +1;


    /**** DYNAMISCHE SPEICHERVERWALTUNG ****/

    buf = (char*) malloc (zufallszahl+1);


    /**** BESCHREIBUNG DES PUFFERS ****/

    for(i=1; i<=zufallszahl; i++)
    {
      buf[i] = 64 + (rand() % CHAR +1);
    }


    /**** RUECKGABE MIT NULLTERMINIERUNG ****/

    buf[i] = '\0';
    return buf;



    }


int main()
{
        char buf;
        srand(time(NULL));
        printf ("%s\n", zufall(buf));


    return 0;
}

die warnung wird für diese zeile in der main funktion gebracht :

Code:

printf ("%s\n", zufall(buf));

Hat jemand ne ahnung warum mir immer dieses ° mit ausgegeben wird?


EDIT: DAs Problem mit dem zeichen ist gelöst, die laufvariable i muss von 0 bis kleiner zufallszahl laufen, weiß jemand warum? Die warnung wird aber immer noch angezeigt

germgerm 06.04.13 17:07

Zitat:

Zitat von Schnidlwuz (Beitrag 24456314)
DAs Problem mit dem zeichen ist gelöst, die laufvariable i muss von 0 bis kleiner zufallszahl laufen, weiß jemand warum?

Ein C-Mensch beginnt immer bei 0 zu zählen und nicht bei 1.
Die erste Position in einem C-String bzw. C-Array ist also 0 und die letzte MAX-1.

Zitat:

Die warnung wird aber immer noch angezeigt
Deine Funktion erwartet als Übergabe-Parameter einen Pointer und bekommt eine Variable, schlimmer Fehler.

PHP-Code:

char *buf 0

Ausserdem verwendest du ein malloc ohne ein free, auch ein schlimmer Fehler.

Das einfachste wäre, du machst es wie urga:

PHP-Code:

char buf[512]; 

oder

PHP-Code:

  char buf[MAXLEN+1]; 


urga 07.04.13 00:48

ja, was allerdings nicht geht ist:
PHP-Code:

charf() {
 
char buf[512];
 
// manipuliere inhalt von buf
 
return buf;
}

main() {
 
char *f(); 
 
// manipuliere/lese inhalt von buf -> programm stürzt früher oder später ab!


lass dir am besten von deinem lehrer erklären warum.

Schnidlwuz 07.04.13 14:22

Zitat:

Schreiben sie eine Funktion welche zwei Einträge eines Arrays vertauscht. Der Funktion sollen die beiden zu vertauschenden Elemente als Argumente übergeben werden. Damit dies funktioniert, müssen Zeiger auf die beiden Elemente (also Pointer auf die Elemente des Arrays die ihrerseits Pointer vom Typ char* sind) übergeben werden. Das bedeutet Sie müssen mit Pointern arbeiten, die wiederum auf Pointer zeigen - die Übergabeparameter der Vertauschungsfunktion müssen also vom Typ char** sein. Verwenden sie nicht die Indexnummer im Array als Übergabeparameter. Testen sie die Funktion indem Sie mit ihrer Hilfe den ersten und letzten Eintrag Ihres Arrays vertauschen und das Array vor und nach der Vertauschung ausgeben lassen.

PHP-Code:

void vertauschung(pointer1pointer2)
{

char hilfs;

hilfs pointer1;
pointer1 pointer2;
pointer2 hilfs;
}

int main ()
{

[.....]

            *
pointer1 = array[0];
            *
pointer2 = array [ARRAYLENGTH-1];
             
vertauschung(*pointer1, *pointer2);


Also diese Aufgabe ist verdammt hart... Ich denke mal mein vertauschungscode sollte passen, ich weiß aber nicht ob die funktion wirklich ein void sein darf, noch wie ich das mit der ausgabe des "vertauschten" arrays hinbekomm. Allgemein die aufgabenstellung mit "pointer auf pointer" verwirrt mich ziemlich und ich weiß nicht wie ich von der funktion aus irgendetwas brauchbares in die main bekomme.

germgerm 07.04.13 16:59

Probiert hast du ja schon, ich denke meine Lösung löst deinen Knopf.

PHP-Code:

void change(char** a0char** a1)
{
  
char save;

  
save = *a0[0];
  *
a0[0] = *a1[0];
  *
a1[0] = save;
}

void main()
{
  
char szStrg[] = {"012345"};
  
charptr0 = &szStrg[0];
  
charptr1 = &szStrg[5];  

  
printf("[%s]\n"szStrg);
  
  
change(&ptr0, &ptr1);

  
printf("[%s]\n"szStrg);  



Schnidlwuz 08.04.13 21:24

danke für den code! allerdings hab ich noch eine frage, warum ist hier eine 0 in der klammer:
PHP-Code:

save = *a0[0]; 
  *
a0[0] = *a1[0]; 
  *
a1[0] = save


ich kann mir dass irgendwie nicht erklären

germgerm 09.04.13 08:01

Die Übergabeparamter sollen laut Vorgabe char** sein, das entspricht einen Pointer auf einen C-String. Die 0 in der Klammer sagt nur, dass der erste Buchstabe vom C-String übergeben werden soll.

urga 09.04.13 18:48

vielleicht hilft auch folgendes zum verständnis:
PHP-Code:

char s1 "12345";
char c1 s[0]; // erstes zeichen von s1
char **s2 = &s1// s2 ist ein zeiger auf s1
char c2 = *s2[0]; // erstes zeichen von s1
char ***s3 = &s2// s3 zeiger auf s2
char c3 = **s3[0// erstes zeichen von s1 

statt *s2[0] und **s3[0] kann man auch (*s2)[0] bzw. (**s3)[0] verwenden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:18 Uhr.

Powered by vBulletin® (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.