Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » while schleife

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
08.10.2003, 13:47 Uhr
geissbock



hi!
tja schon wieder komme ich nicht 100%ig weiter. wird wohl wieder nicht schwierig sein für euch.


C++:
register char *mark;

ptr = path  
mark = NULL;
while ((ptr != NULL) && (--components >= 0))
   {
      if (mark)
              *mark = '\0';
      ptr = strrchr(path, '/');
      if (mark)
     *mark = '/';
      mark = ptr;
   }
   return ((ptr == NULL) ? path : ptr + 1);



wenn componets auf zwi gesetzt wird, heißt das es sind zwei durchläufe?
wieso wird *mark beim ersten if auf \0 gesetzt?
wieso den beim zweiten if auf /?
und die return anweisun kapier ich echt nicht!

mfg geissbock
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.10.2003, 13:54 Uhr
Pablo
Supertux
(Operator)


Was ist components? Ist ein Argument oder deklariert die Funktion als lokale Variable? Was für ein Wert hat components?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.10.2003, 14:02 Uhr
Pablo
Supertux
(Operator)


strrchr liefert einen Pointer von der Zeichenkette nach dem letzten Eintreffen, bsp:

strrchr("abcdfegasd", 'a') leifert asd

Am Anfang ist mark == NULL. ptr wird irgendwann NULL, weil irgendwann gibt es keine '/' mehr und dann ist prt NULL und somit verlässt die While-Schleife.

return ((ptr == NULL) ? path : ptr + 1);
tja, wenn prt NULL ist, dann muss path zurückgegeben werden (ich nehme an die Funktion ist eine char* ) Wenn prt aber nicht NULL ist dann (hier glaube ich, bin aber nicht 100% sicher) wird ein Pointer ab das nächste Byte zurückgeben, auf das prt zeigt.

Den Rest muss ich noch überlegen.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
08.10.2003, 14:04 Uhr
geissbock



lokale variable

C++:
static char *        
base_name(char *path,
      int components)



wird mit zwei übergeben.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
08.10.2003, 14:06 Uhr
Pablo
Supertux
(Operator)


Hab mir schon gedacht, aber was für ein Wert wird dann components dann übergeben?


Bearbeitung:
Wie rufst du die Funktion auf?

--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 08.10.2003 um 14:07 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
08.10.2003, 14:19 Uhr
geissbock



auf zwei! hatte ich eigenlich schon geschrieben. ist aber durch das vergessenen "e" wohl nicht richtig rübergekommen

C++:
base_name(argv[0], 2), (long) pid, delay);


Dieser Post wurde am 08.10.2003 um 14:22 Uhr von geissbock editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
08.10.2003, 14:26 Uhr
geissbock




C++:
return ((ptr == NULL) ? path : ptr + 1);



ist also gleich diesem ausdruck


C++:
if (ptr==NULL)
   return (path)
else
   return (ptr + 1)

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
08.10.2003, 14:30 Uhr
Pablo
Supertux
(Operator)



Zitat:
geissbock postete

C++:
return ((ptr == NULL) ? path : ptr + 1);



ist also gleich diesem ausdruck


C++:
if (ptr==NULL)
   return (path)
else
   return (ptr + 1)



Ja
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
09.10.2003, 01:24 Uhr
Alf



Aber ne Gefährlich schleife.
path muss ein Null-terminated string sein. Das Heißt da ist Arbeitsspeicher für die Variable path reserviert und das letzte Byte hat den wert 0 (NULL).
Nun sucht die Schleife Rückwerts nach dem Zeichen '/' und überschreibt dann das nach folgende Byte mit dem Zeichen '0' (Wert 48 ASCII). Na Gut. Ist aber, das Zeichen vor der NULL am ende, das Zeichen '/' dann überschreibt die Schleife die NULL am ende mit dem Zeichen '0' (wert 48) beim erneuten auf ruf von ptr = strrchr(path, '/'); liest die Funktion über den Reservierten Speicher hinaus und über schreibt fremden Speicher!

Wo hast du die Schleife denn her?
--
Mfg

Andy
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
09.10.2003, 01:48 Uhr
Pablo
Supertux
(Operator)



Zitat:
Alf postete
Aber ne Gefährlich schleife.
path muss ein Null-terminated string sein. Das Heißt da ist Arbeitsspeicher für die Variable path reserviert und das letzte Byte hat den wert 0 (NULL).
Nun sucht die Schleife Rückwerts nach dem Zeichen '/' und überschreibt dann das nach folgende Byte mit dem Zeichen '0' (Wert 48 ASCII). Na Gut. Ist aber, das Zeichen vor der NULL am ende, das Zeichen '/' dann überschreibt die Schleife die NULL am ende mit dem Zeichen '0' (wert 48) beim erneuten auf ruf von ptr = strrchr(path, '/'); liest die Funktion über den Reservierten Speicher hinaus und über schreibt fremden Speicher!

Wo hast du die Schleife denn her?



Ach klar, im Prinzip macht dasselbe, wie die Andere Schleife, aber rückwerts.mir ist nicht das mit dem strrchr eingefallen, obwohl ich gepostt hab, was das macht.

Die meisten strings sind immer 0-Terminierend und als C Programmier müsste man dafür sorgen, dass ihre Strings 0-terminierend sein.
Ich mach ab und zu keine 0-terminidernende strings, aber ich passe ich sehr gut auf sie auf.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: