此代码是否删除了文件扩展名?

Ube*_*per 4 c c++

这不是我的代码; 我试图找出这究竟是什么.这是用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 );
    }
}
Run Code Online (Sandbox Code Playgroud)

DestFile2未在函数中的任何其他位置设置.我编译了上面的代码,并打印出DestFile显示没有任何改变.我唯一能想到的就是删除文件扩展名(*Ptr = 0),但我对C的了解非常有限......

有任何想法吗?看起来每次获取带.gz或.z的文件时,它都会将文件重命名为相同的名称.

Sor*_*raz 18

你是对的.

在C中,字符串是由ASCII代码为0的字符终止的字符数组.

因此,首先,将DestFile复制到DestFile2

然后执行右扫描,找到最右边的'.'.这将返回指向匹配的char的指针,如果未找到匹配则返回null.

所以现在你有了(例子名:myfile.gz)

DestFile2

              |- Ptr
              v    
  M y f i l e . g z \0
Run Code Online (Sandbox Code Playgroud)

然后它比较从Ptr开始的字符串是否匹配.Z或.gz,如果匹配,则将Ptr指向的char的值设置为\ 0,从而有效地截断字符串.

将Ptr设置为\ 0后,您就可以了

M yfile\0 gz\0

请记住,当我们达到\ 0时,c认为字符串已完成,因此最后一次重命名有效地说明了

rename("myfile.gz", "myfile");
Run Code Online (Sandbox Code Playgroud)