Willkommen |
|
myGully |
|
Links |
|
Forum |
|
|
|
|
05.04.13, 19:19
|
#1
|
Anfänger
Registriert seit: Sep 2009
Beiträge: 10
Bedankt: 1
|
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
|
|
|
05.04.13, 20:31
|
#2
|
Mitglied
Registriert seit: Aug 2009
Ort: void* (*wtf[])(void **);
Beiträge: 454
Bedankt: 137
|
eine mögliche (std C) lösung:
PHP-Code:
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h> #include <assert.h>
char* rndstring (char* buf, int length) { int i; assert (length < 512); for (i=0; i < length; i++) { buf[i] = 64 + (rand() % 10); } buf[i] = '\0'; return buf; }
main() { char buf[512]; srand(time(NULL)); printf ("%s\n", rndstring (buf, 10)); }
die konstanten müssten noch per #define definiert werden.
__________________
entropie erfordert keine wartung
|
|
|
05.04.13, 22:02
|
#3
|
Anfänger
Registriert seit: Sep 2009
Beiträge: 10
Bedankt: 1
|
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?
|
|
|
05.04.13, 22:05
|
#4
|
Hinter dir!
Registriert seit: Apr 2010
Beiträge: 1.125
Bedankt: 487
|
Ja die Zeile kannst du rauslöschen, oder besser durch ein if ersetzen.
|
|
|
05.04.13, 23:10
|
#5
|
Erfahrener Newbie
Registriert seit: Mar 2010
Beiträge: 131
Bedankt: 81
|
...weil ich gerade string.h sehe.
c oder c++?
ansonsten kannst du ja auch die string-klasse nutzen.
|
|
|
06.04.13, 01:46
|
#6
|
Anfänger
Registriert seit: Sep 2009
Beiträge: 10
Bedankt: 1
|
C, C++ kommt erst noch
|
|
|
06.04.13, 12:42
|
#7
|
Anfänger
Registriert seit: Sep 2009
Beiträge: 10
Bedankt: 1
|
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
|
|
|
06.04.13, 17:07
|
#8
|
bla
Registriert seit: Mar 2010
Beiträge: 309
Bedankt: 301
|
Zitat:
Zitat von Schnidlwuz
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.
Ausserdem verwendest du ein malloc ohne ein free, auch ein schlimmer Fehler.
Das einfachste wäre, du machst es wie urga:
oder
PHP-Code:
char buf[MAXLEN+1];
|
|
|
07.04.13, 00:48
|
#9
|
Mitglied
Registriert seit: Aug 2009
Ort: void* (*wtf[])(void **);
Beiträge: 454
Bedankt: 137
|
ja, was allerdings nicht geht ist:
PHP-Code:
char* f() { char buf[512]; // manipuliere inhalt von buf return buf; }
main() { char *x = 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
|
|
|
07.04.13, 14:22
|
#10
|
Anfänger
Registriert seit: Sep 2009
Beiträge: 10
Bedankt: 1
|
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(pointer1, pointer2) { 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.
|
|
|
07.04.13, 16:59
|
#11
|
bla
Registriert seit: Mar 2010
Beiträge: 309
Bedankt: 301
|
Probiert hast du ja schon, ich denke meine Lösung löst deinen Knopf.
PHP-Code:
void change(char** a0, char** a1) { char save; save = *a0[0]; *a0[0] = *a1[0]; *a1[0] = save; } void main() { char szStrg[] = {"012345"}; char* ptr0 = &szStrg[0]; char* ptr1 = &szStrg[5]; printf("[%s]\n", szStrg); change(&ptr0, &ptr1); printf("[%s]\n", szStrg); }
|
|
|
08.04.13, 21:24
|
#12
|
Anfänger
Registriert seit: Sep 2009
Beiträge: 10
Bedankt: 1
|
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
|
|
|
09.04.13, 08:01
|
#13
|
bla
Registriert seit: Mar 2010
Beiträge: 309
Bedankt: 301
|
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.
|
|
|
09.04.13, 18:48
|
#14
|
Mitglied
Registriert seit: Aug 2009
Ort: void* (*wtf[])(void **);
Beiträge: 454
Bedankt: 137
|
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
|
|
|
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
HTML-Code ist Aus.
|
|
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:07 Uhr.
().
|