myGully.com Boerse.SH - BOERSE.AM - BOERSE.IO - BOERSE.IM Boerse.BZ .TO Nachfolger
Zurück   myGully.com > Computer & Technik > Programmierung
Seite neu laden

Zufallstexte C

Willkommen

myGully

Links

Forum

 
Antwort
Themen-Optionen Ansicht
Ungelesen 05.04.13, 19:19   #1
Schnidlwuz
Anfänger
 
Registriert seit: Sep 2009
Beiträge: 10
Bedankt: 1
Schnidlwuz ist noch neu hier! | 0 Respekt Punkte
Standard 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
Schnidlwuz ist offline   Mit Zitat antworten
Ungelesen 05.04.13, 20:31   #2
urga
Mitglied
 
Benutzerbild von urga
 
Registriert seit: Aug 2009
Ort: void* (*wtf[])(void **);
Beiträge: 454
Bedankt: 137
urga ist noch neu hier! | 0 Respekt Punkte
Standard

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.
__________________
entropie erfordert keine wartung
urga ist offline   Mit Zitat antworten
Ungelesen 05.04.13, 22:02   #3
Schnidlwuz
Anfänger
 
Registriert seit: Sep 2009
Beiträge: 10
Bedankt: 1
Schnidlwuz ist noch neu hier! | 0 Respekt Punkte
Standard

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?
Schnidlwuz ist offline   Mit Zitat antworten
Ungelesen 05.04.13, 22:05   #4
Your_Conscience
Hinter dir!
 
Registriert seit: Apr 2010
Beiträge: 1.125
Bedankt: 487
Your_Conscience ist noch neu hier! | 0 Respekt Punkte
Standard

Ja die Zeile kannst du rauslöschen, oder besser durch ein if ersetzen.
Your_Conscience ist offline   Mit Zitat antworten
Ungelesen 05.04.13, 23:10   #5
Partyanne
Erfahrener Newbie
 
Registriert seit: Mar 2010
Beiträge: 131
Bedankt: 81
Partyanne gewöhnt sich langsam dran | 10 Respekt Punkte
Standard

...weil ich gerade string.h sehe.

c oder c++?

ansonsten kannst du ja auch die string-klasse nutzen.
Partyanne ist offline   Mit Zitat antworten
Ungelesen 06.04.13, 01:46   #6
Schnidlwuz
Anfänger
 
Registriert seit: Sep 2009
Beiträge: 10
Bedankt: 1
Schnidlwuz ist noch neu hier! | 0 Respekt Punkte
Standard

C, C++ kommt erst noch
Schnidlwuz ist offline   Mit Zitat antworten
Ungelesen 06.04.13, 12:42   #7
Schnidlwuz
Anfänger
 
Registriert seit: Sep 2009
Beiträge: 10
Bedankt: 1
Schnidlwuz ist noch neu hier! | 0 Respekt Punkte
Standard

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
Schnidlwuz ist offline   Mit Zitat antworten
Ungelesen 06.04.13, 17:07   #8
germgerm
bla
 
Registriert seit: Mar 2010
Beiträge: 309
Bedankt: 301
germgerm ist noch neu hier! | 0 Respekt Punkte
Standard

Zitat:
Zitat von Schnidlwuz Beitrag anzeigen
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]; 
germgerm ist offline   Mit Zitat antworten
Ungelesen 07.04.13, 00:48   #9
urga
Mitglied
 
Benutzerbild von urga
 
Registriert seit: Aug 2009
Ort: void* (*wtf[])(void **);
Beiträge: 454
Bedankt: 137
urga ist noch neu hier! | 0 Respekt Punkte
Standard

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.
__________________
entropie erfordert keine wartung
urga ist offline   Mit Zitat antworten
Ungelesen 07.04.13, 14:22   #10
Schnidlwuz
Anfänger
 
Registriert seit: Sep 2009
Beiträge: 10
Bedankt: 1
Schnidlwuz ist noch neu hier! | 0 Respekt Punkte
Standard

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.
Schnidlwuz ist offline   Mit Zitat antworten
Ungelesen 07.04.13, 16:59   #11
germgerm
bla
 
Registriert seit: Mar 2010
Beiträge: 309
Bedankt: 301
germgerm ist noch neu hier! | 0 Respekt Punkte
Standard

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);  

germgerm ist offline   Mit Zitat antworten
Ungelesen 08.04.13, 21:24   #12
Schnidlwuz
Anfänger
 
Registriert seit: Sep 2009
Beiträge: 10
Bedankt: 1
Schnidlwuz ist noch neu hier! | 0 Respekt Punkte
Standard

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
Schnidlwuz ist offline   Mit Zitat antworten
Ungelesen 09.04.13, 08:01   #13
germgerm
bla
 
Registriert seit: Mar 2010
Beiträge: 309
Bedankt: 301
germgerm ist noch neu hier! | 0 Respekt Punkte
Standard

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.
germgerm ist offline   Mit Zitat antworten
Ungelesen 09.04.13, 18:48   #14
urga
Mitglied
 
Benutzerbild von urga
 
Registriert seit: Aug 2009
Ort: void* (*wtf[])(void **);
Beiträge: 454
Bedankt: 137
urga ist noch neu hier! | 0 Respekt Punkte
Standard

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.
__________________
entropie erfordert keine wartung
urga ist offline   Mit Zitat antworten
Antwort


Forumregeln
Du kannst keine neue Themen eröffnen
Du kannst keine Antworten verfassen
Du kannst keine Anhänge posten
Du kannst nicht deine Beiträge editieren

BB code is An
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.

Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:07 Uhr.


Sitemap

().