Verstehe Funktion mit sprintf nicht.
-
"Die for-Schleife überprüft jedes einzelne Zeichen in der Zeile auf Semikolon, falls ein Semikolon vorhanden ist."
-> Richtig. Der String wird druchgegangen und jedes Zeichen wird mit ';' verglichen.
"Wenn die Eingabe ein Semikolon ist, dann wird diese Information im Array exist als char gespeichert."
-> Zunächst einmal wird ein Integerwert um 1 erhöht, wenn ein ';' gefunden wurde.
"Mit sprintf wird der Wert, er in exist als char gespeichert in einen integer Wert umgewandelt?"
-> Versteh ich nicht ganz. Die Integervariable, retval (die ja vorher immer um 1 erhöht wurde), wird nun in einen String gepackt (der String wird formatiert quasi). Und ein String ist nichts anderes als ein Char Zeiger (=Arry). Er speichert ja eine Adresse ,und zwar die des ersten Elements, zB
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!
ptr(der Zeiger)**------------------>**CharSpeicher
__________________________________CharSpeicher
__________________________________CharSpeicher
__________________________________CharSpeicher
__________________________________CharSpeicher
__________________________________...
ptr[0] // = 1
oder aber
ptr // = gesamter String, ebenso geht auch &ptr[0]
oder wie bei "normalen" Zeigern per *
ptr* // = 1, da der Zeiger auf das 1 Element verweist!Dies passiert, wenn du ein Arry der gleichen Art anlegst, also
char str[5];
nur interen eben.Bin selber Anfänger, wenn also Fehler sind verbessern
-
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);