这不是我的代码;我想弄清楚这到底是做什么的。这是一个用 C 语言编写的大型古老系统的一部分(实际上它是 4 年前编写的,但很可能是由 80 年代末程序员心态编写的)。部分代码:
char DestFile[256];
char DestFile2[256];
//This part is just to show an example
strcpy(DestFile, "/foo/boo/goo.gz")
strcpy ( DestFile2, DestFile );
Ptr = strrchr ( DestFile2, '.' );
if ( Ptr != 0 ) {
if ( ( strcmp ( Ptr, ".gz" ) == 0 ) ||
( strcmp ( Ptr, ".Z" ) == 0 ) ) {
*Ptr = 0;
rename ( DestFile, DestFile2 );
}
}
DestFile2 未在函数中的其他任何位置设置。我编译了上面的代码,并打印出 DestFile 显示没有任何变化。我唯一能想到的就是删除文件扩展名(*Ptr=0),但我对 C 的了解非常有限......
有任何想法吗?看起来每次它获取带有 .gz 或 .z 的文件时,都会将该文件重命名为相同的名称。
你是对的。
在 C 中,字符串是一个以 ASCII 代码 0 的字符结尾的字符数组。
所以,首先,DestFile被复制到DestFile2
然后执行从右侧的扫描,以找到最右侧出现的“.”。
这将返回一个指向匹配的字符的指针,如果未找到匹配的字符,则返回 null。
现在你有了(示例名称:myfile.gz)
目标文件2
|- Ptr
v
M y f i l e . g z \0
然后它比较从 Ptr 开始的字符串是否匹配 .Z 或 .gz,如果匹配,则将 Ptr 指向的字符的值设置为 \0,从而有效地截断该字符串。
将 Ptr 设置为 \0 后,您现在拥有
我的文件 \0 g z \0
请记住,当我们到达 \0 时,c 认为字符串已完成,因此最后的重命名实际上表示
rename("myfile.gz", "myfile");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)