这段关于scanf的代码是什么?

时间:2017-01-03 07:42:47

标签: c++

我正在浏览我朋友的obj加载代码。他用C ++完成了它;代码是:

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); 

 ......

当我通过加载obj文件测试它时,它正确打开。但是我不理解sscanf()的第一个参数,即:&STREAM[&t[0]-&STREAM[0]-10]。请解释它是如何工作的?

4 个答案:

答案 0 :(得分:5)

t = strstr(STREAM,"vertices");

t将指向"vertices"内的子字符串STREAM的位置。

&t[0]"vertices"中第一个字符的地址。相当于t本身。 这同样适用于&STREAM[0],它是STREAM的第一个字符的地址。减去它们会为您提供t的起始索引。

所以你的朋友想要从STREAM开始阅读,在 t之前开始十个字符

所有这些都通过简单的t - 10更明确地表达出来。

答案 1 :(得分:4)

我不知道为什么会这样做但是

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

相同

t-10

在“顶点”(和“面孔”)开始之前是10个字符

答案 2 :(得分:3)

你的朋友经常参加一些混淆的C竞赛吗?

&t[0]获取*t中第一个字节的地址。该地址当然是t已包含的内容。

类似于&STREAM[0],其地址与STREAM相同。

因此,&t[0]-&STREAM[0]计算tSTREAM开头之间的字节数(字符)。如果您将其用作STREAM的索引并获取 字节&STREAM[&t[0]-&STREAM[0]]的地址 - 再次获取t中已有的地址。

如果你从&STREAM[&t[0]-&STREAM[0]-10]中减去10个字节,最后会得到t - 10 ...

答案 3 :(得分:1)

& STREAM [& t [0] - & STREAM [0] -10] =& STREAM [addressof(t [0]) - addressof(STREAM [0]) - 10]。它给出了tSTREAM的偏移量减去10.写t - 10将是相同的,因为知道tSTREAM是同一缓冲区上的指针。