coreutils4.5.1 basename.c源码分析3

coreutils4.5.1 basename.c源码分析2
前几天又重新读了basename.c对其中去掉后缀的那段,终于理解了。现总结如下;

static void
remove_suffix (char *name, const char *suffix)
{
  char *np;
  const char *sp;

  np = name + strlen (name);
  sp = suffix + strlen (suffix);

  while (np > name && sp > suffix)
    if (*--np != *--sp)
      return;
  if (np > name)
    *np = '\0';
}
其中关键是while循环,当初我不理解,心想,其中return不是跳出了程序吗?当时想,如果部分后缀相等,那岂不是不会截断了,如下
./basename /a/b/c2.ok3  xk3
结果是:
c2.ok3
验证了我的猜想,因为当只有部分相等时,此时是return出来了。只有后缀完全相等,时,此时,(np > name && sp > suffix)不满足了,为此跳出循环,执行
  if (np > name)
    *np = '\0';
把文件名中末尾和后缀相等的部分直接去掉。
作者对字符串处理的部分出神入化,不佩服都不行呀。
 

猜你喜欢

转载自blog.csdn.net/woshiyilitongdouzi/article/details/85076854