Verstehe Funktion mit sprintf nicht.
-
Korn schrieb:
char *ptr; // Zeiger anglegen , immer 4 Byte soweit ich weiß
ptr = (charmalloc(5 * sizeof(char)); // Nun reservieren wir Speicher - und zwar 5 mal die größe von eine, Char.
// Die Adresse ist nun aber die Adresse des ersten Elements.Nun können wir beispielsweise
ptr = "1234"; // Wichtig: Wir haben 5 Speichereinheiten, doch die letzte ist \0, Nullterminierung!
Wenn du das machst, verlierst du die Adresse der ersten Elements, denn:
die Adresse der Zeichenkette "1234" wird dem Zeiger ptr zugewiesen, der von malloc erhaltene Rückgabewert wird überschrieben, der angeforderte Speicher ist nicht mehr zugängig. Ein Loch im Arbeitsspeicher ist entstanden (Memoryleak), denn der Speicher kann nicht mehr freigegeben werden.
Du müsstest strcpy(ptr, "1234"); oder sowas schreiben, dann kannst du den Speicher später mit free(ptr) wieder freigeben.
-
Danke soweit.
Habe noch eine Frage zu:
sprintf( exist, "%d", retval );
verstehe das so:
exist ist der array in dem die semikolons abgelegt sind,
"%d" ist der integer-Wert(von retval) der in eine Zeichenkette umgewandelt werden soll
retval ist die Variable die z.B den Wert drei für drei Semikolons enthält?Ist das richtig?
-
danzriba schrieb:
Ist das richtig?
Ja.
BTW: dass die Funktion so ein Mist ist, dass du dir daran kein Beispiel nehmen solltest, ist dir klar?
-
µngbd schrieb:
danzriba schrieb:
Ist das richtig?
Ja.
Doch nicht.
exist ist ein char-Array, das der Aufrufer übergeben muss, damit sprintf() darin den String formatieren kann
"%d" ist der Formatstring, der sprintf() sagt, dass es in das char-Array etwas schreiben soll, das wie eine ganze Zahl aussieht
retval ist die Variable, in der du die ';' gezählt hast.
-
sprintf ist dasselbe wie printf, nur dass es nicht auf dem Bildschirm ausgegeben wird, sondern in einen String den du als ersten Parameter übergibst.
exist ist der zu schreibende String, "%d" ist der konstante String der in exist reingeschrieben werden soll, retval ist ein int was sprintf an die Stelle von %d schreibt.
-
nwp2 schrieb:
..."%d" ist der konstante String der in exist reingeschrieben werden soll, retval ist ein int was sprintf an die Stelle von %d schreibt.
naja, das klingt irgendwie nicht richtig, ich versuch's auch mal: "%d" ist ein formatstring, der 'sprintf' sagt, was es mit den folgenden argumenten machen soll. in diesem fall (%d) soll 'sprintf' aus einem int (retval) einen string aus ziffern machen (z.b. den string "0" wenn kein semikolon gefunden wurde). dieser string wird dorthin geschrieben, worauf 'exist' zeigt.
-
Wie sieht der string bei 3 Semikolons aus: 3 oder 111?
-
danzriba schrieb:
Wie sieht der string bei 3 Semikolons aus: 3 oder 111?
"%d" ist für dezimalzahlen, jetzt rate mal? wer ist für drei und wer tippt auf hundertelf? *fg*
-
Danke
Hatte einen Denkfehler, dachte pro Semikolon gibt er eine 1 zurück.
-
Uhh, danke Big Brother hab ich ganz vergessen gehabt. Eine String Literale nimmt ebenso speicher ein....danke nochmals!
:xmas1:
-
Keine Ursache, Bruder!
-
Hallo,
im Gegensatz zu Java oder VC++ verstehe ich die Stringformatierungen.
In VC++ meinetwegen wenn ich einen String habe und diesen formatieren will, sprich auch was anhängen will, geht das so:
String str,str1; str1 = "HalloXY"; str = str1 + String.Format("%d.%d",getPointX(),getPointY());
Eine einfache Konkatination.
Wenn ich in C das schreibe, dachte ich sprintf schreibt in einen String zusätzlich einen Wert, anstatt ihn zu überschreiben.
Schreib ich beispielsweise:
sprintf(stringX,"%d",iX);
wird hier nicht in den String zusätzlich hineingeschrieben, also bei der Ausgabe
stringX 1
stringX 2
...
...Gibt es nicht auch eine Methode anders zu konkatinieren?
Ich habe das versucht mit der einfachen stringX = stringX + sprintf(...),
jedoch eine Warnung/Fehler, warum?error: incompatible types in assignment
Danke
-
kpl. ob das geht probiers doch mal und sag uns bescheid;)
sprintf(stringX,"%s%d",stringX,iX);