Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » for 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 <
000
08.10.2003, 11:30 Uhr
geissbock



hi!
ich denke mal das ist für euch profis ein klacks.


C++:
for (len = strlen(path) - 1;                    
     (len > 0) && (path[len] == '/');        
     path[len--] = '\0')    
     ;


könnt ihr mir das mal zeile für zeile erklären?


(len = strlen(path) - 1; =>ws kann der vorteil von -1 sein?
(len > 0) && (path[len] == '/'); =>also nur wenn / am ende?
path[len--] = '\0') =>von hinten immer \0 schreiben?
=> bis der erste / erreicht ist?

mfg geissbock
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.10.2003, 11:42 Uhr
virtual
Sexiest Bit alive
(Operator)


Diese Programfragemnt dient dazu, "trailing slashes" aus einem Path zu entfernen. Wenn du sowas hast "/usr/bin/", dann wird daraus "/usr/bin".
Nehmen wir also mal an, path = "/usr/bin/". Der Text ist 9 Zeichen lang.

In pseudocode sieht das so aus:

Code:
Eingabe: path mit Pfadangabe.

solange path am Ende ein "/" hat und path mindestens zwei Zeichen lang ist
     entferne das letzte zeichen aus path
end solange



strlen(path)-1 gibt somit 8 zurück (len ist also erstmal 8).
Nun werden bei einem String ja die Zeichen von 0 - N-1 gezählt: path[0] ist das erste Zeichen des Strings, path[N-1] ist das N-te Zeichen. path[len] zeigt also auf das letzte Zeichen, ohne das -1 würde es auf das terminierende 0 Byte Zeigen.

Um das weitere zu verstehen, schreibe ich die Schleife ein wenig um (sie macht aber noch immer das gleiche:

C++:
for (len = strlen(path) - 1; (len > 0) && (path[len] == '/'); len--)      
{
    path[len] = '\0';
}


Solange also len>0 ist und ein '/' an path[len] steht, werden zwei Dinge gemacht: Zum einen wird das / durch ein 0 Byte ersetzt und zum anderen wird len um einen runtergezählt.
Das len>0 soll den Fall abfangen, daß wenn path="/" ist, der gesamt Pfad gelöscht wird.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 08.10.2003 um 11:43 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.10.2003, 11:45 Uhr
Pablo
Supertux
(Operator)


path ist ein char*, also eine Zeichenkette

len = strlen(path)-1 heißt, dass die Variable (wahrscheinlich vom Typ int) len mit der Länge der Zeichenkette - 1 initialisiert, weil der letzte gültige Buchstabe, auf den man zugreifen kann (vor '\0') ist nämlich strlen(path)-1

Die Bedingung der For-Schleife ist (len > 0) && (path[len] == '/'); was sagt folgendes:
Tue, was in de For schleife ist (in diesem Fall gar nix, solange die Bedingug wahr ist.
Die Bedingung (len > 0) && (path[len] == '/') ist wahr wenn:
die Variable len einen Wert speichert, der größer als 0 ist und das Charakter (der Buchstabe) von der Zeichenkette path an der Stelle len '/' einem Slash entspricht.

path[len--] = '\0'
===========
Jedesmal, wenn die Bedingung wahr ist, wird das Charackter an der Stelle len mit dem 0-Terminierend-Charakter '\0' gesetzt und len um 1 dekrementiert (wegen len--).

Was das ganze tut.

Stell dir vor du hast
char* path="/Verzeichnis1/Verzeichnis2////////";
Der Pfad ist ungültig, wegen den vielen ///////
Die For-Schleife mach sie weg.
path[0] = '/'
path[1] = 'V'
path[2] = 'e'
...
path[strlen(path)-1] = '/' (das letzte / vom ganzen /////////)
path[strlen(path)] = '\0'

Die Forschleife weißt in len die Länge der Zeichenkette zu. Dann überprüft:
ist len > 0 ? ja. Ist path[len] = '/' ? ja. Also machen wir / weg, indem ich path[len]='\0' setze. Somit habe ich das letzte / entfernt. Dann dekrementiere len um 1.
Und nochmal.
st len > 0 ? ja. Ist path[len] = '/' ? ja. Also machen wir / weg, indem ich path[len]='\0' setze. Somit habe ich das letzte / entfernt. Dann dekrementiere len um 1.
Und nochmal..... das ganz wird ausgfeührt, bis len eine Zahl ist, bei der path[len] = '2' also != '/', dann weißt er, gut, somit haben wir alle unnötige / gelöscht, jetzt sind wir fertig.

Es könnte sein, dass char* path = "//////////////////";
Da path nur / hat, dann wird irgendwann len == -1 und path[-1] gibt es nicht, deshlab die Bedingung len > 0 && ....

Bearbeitung:
ts.ts..... virtual war wohl bisschen schneller als ich

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

Dieser Post wurde am 08.10.2003 um 11:46 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
08.10.2003, 11:46 Uhr
virtual
Sexiest Bit alive
(Operator)



C++:
int len = strlen(path);
while (len>=2 && path[len-1]=='/')
{
     path[len-1] = 0;
     --len;
}


Macht das gleiche, ist halt nur verbose Source.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 08.10.2003 um 11:47 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
08.10.2003, 11:56 Uhr
geissbock



erstmal danke für die ausführliche erkärung. aber zu pablo: strlen liefert die länge ohne /0!!!
d.h. wenn ich eure erklärungen richtig verstanden habe das die schleife nur die unnötigen / entfernt aber den letzten beibehält!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
08.10.2003, 12:16 Uhr
0xdeadbeef
Gott
(Operator)


strlen liefert die Länge ohne null, ja. Aber Arrays und Strings verwenden in C null-basierte Indices. Das heißt, ein Array der Länge 100:

C++:
int mein_array[100];


geht von mein_array[0] bis mein_array[99]. Mit chars ist es genauso:

C++:
char test[] = "Test";


deklariert ein char-array der Länge 5 mit folgendem Inhalt:

test[0] = 'T'
test[1] = 'e'
test[2] = 's'
test[3] = 't'
test[4] = '\0'

strlen(test) wäre 4. Du willst aber das Null-Zeichen nicht mitüberprüfen (das ist dir ziemlich egal), sondern beim letzten Zeichen des Strings anfangen, deswegen nimmst du strlen(test) - 1.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
08.10.2003, 12:24 Uhr
geissbock



klar! hab ich wieder nicht mitgedacht.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
08.10.2003, 13:51 Uhr
Pablo
Supertux
(Operator)



Zitat:
geissbock postete
erstmal danke für die ausführliche erkärung. aber zu pablo: strlen liefert die länge ohne /0!!!
d.h. wenn ich eure erklärungen richtig verstanden habe das die schleife nur die unnötigen / entfernt aber den letzten beibehält!


Ja, ich weiß, das habe ich auch gesagt.
--
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
08.10.2003, 13:53 Uhr
geissbock



ja. wie gesagt mein denkfehler. 0xdeadbeef hat mich drauf aufmerksam gemacht.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ 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: