2017-01-03 5 views
0

Ich schaute durch den Ladecode meines Freundes obj. Er hat es in C++ gemacht; Der Code lautet:Was ist dieses Stück Code in Bezug auf scanf?

bool LoadObj(char* given){ 
    char tempText[60]; 
    std::ifstream OB(given); 
    OB.seekg(0,OB.end); int length = OB.tellg() ; OB.seekg(0,OB.beg); 

    char* STREAM = new char[length]; 
    OB.read(STREAM,length); 
    OB.close(); 

    char *t,dump[20]; 
    int Number_Of_Vertices,Number_Of_faces; 



    t = strstr(STREAM,"vertices"); 
    sscanf(&STREAM[&t[0]-&STREAM[0]-10],"%s # %i vertices",&dump,&Number_Of_Vertices); 
    printf("\nthere are %i vertices",Number_Of_Vertices); 

    t = strstr(STREAM,"faces"); 
    sscanf(&STREAM[&t[0]-&STREAM[0]-10],"%s # %i faces",&dump,&Number_Of_faces); 
    printf("\nthere are %i faces",Number_Of_faces); 

...... 

Wenn ich dies durch Laden einer Obj-Datei getestet, wurde es korrekt geöffnet. Allerdings verstehe ich nicht das erste Argument zu sscanf(), nämlich: &STREAM[&t[0]-&STREAM[0]-10]. Bitte erläutern, wie es funktioniert?

+3

Können Sie nicht Ihr Freund fragen? Es ist ihr Code, sie sollten es besitzen. – StoryTeller

+0

Ich kann ihn fragen, aber er ist bis Freitag beschäftigt. – Fennekin

+0

Dies ist die Obj-Datei http://pastebin.com/pvi7bU6y – Fennekin

Antwort

5
t = strstr(STREAM,"vertices"); 

t zeigt auf die Position des Teilstrings "vertices", innerhalb STREAM.

&t[0] ist die Adresse des ersten Zeichens in "vertices". Entspricht t selbst. Das gleiche gilt für &STREAM[0], es ist die Adresse des ersten Zeichens STREAM. Subtrahieren gibt Ihnen den Startindex t.

Also Ihr Freund möchte von STREAM lesen, beginnend zehn Zeichen vort.

All dies wird deutlich klarer ausgedrückt durch eine einfache t - 10.

+1

Nein, er möchte * aus 'STREAM' lesen, beginnend mit zehn Zeichen vor' t'. Genauer gesagt lesen Sie die Formatzeichenfolge '% s #% i vertices'. Außerdem: da es nur zehn Zeichen vor "t" liest, dürfen die Zeichenfolge und die Ganzzahl nicht zu groß sein. – gurka

+0

@gurka - Sie sind in der Tat richtig. Ich hatte es fälschlicherweise in meinen Kopf gebrannt, der OP hatte dort "sprintf", und nicht "sscnaf". – StoryTeller

4

Ich weiß nicht, warum es so aber

&STREAM[&t[0]-&STREAM[0]-10]

ist die gleiche wie

t-10

Es ist 10 Zeichen vor dem Beginn der „Eckpunkte“ (und "getan Gesichter ")

1

& STREAM [& t [0] - & STREAM [0] -10] = & STREAM [AddressOf (t [0]) - AddressOf (Strom [0]) - 10]. Es gibt den Offset von t in STREAM minus 10. Das Schreiben t - 10 wäre das gleiche gewesen, wissend, dass t und STREAM Zeiger auf demselben Puffer sind.

3

Spielt Ihr Freund einige Obfuscated C-Wettbewerbe?

&t[0] übernimmt die Adresse des ersten Bytes in *t. Diese Adresse ist natürlich was t bereits enthält.

Ähnlich für &STREAM[0], die die gleiche Adresse wie STREAM ist.

So, &t[0]-&STREAM[0] berechnet die Anzahl der Bytes (Zeichen) zwischen t und dem Start STREAM. Wenn Sie das als Index in STREAM verwenden und die Adresse nehmen, die byte &STREAM[&t[0]-&STREAM[0]] - wieder erhalten Sie die Adresse, die bereits in t war.

Und wenn Sie aus, dass 10 Bytes subtrahieren, &STREAM[&t[0]-&STREAM[0]-10], beenden Sie mit t - 10 up ...

Verwandte Themen