这不是我的代码; 我试图找出这究竟是什么.这是用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
然后执行右扫描,找到最右边的'.'.这将返回指向匹配的char的指针,如果未找到匹配则返回null.
所以现在你有了(例子名:myfile.gz)
DestFile2
|- Ptr v M y f i l e . g z \0
然后它比较从Ptr开始的字符串是否匹配.Z或.gz,如果匹配,则将Ptr指向的char的值设置为\ 0,从而有效地截断字符串.
将Ptr设置为\ 0后,您就可以了
M yfile\0 gz\0
请记住,当我们达到\ 0时,c认为字符串已完成,因此最后一次重命名有效地说明了
rename("myfile.gz", "myfile");