1. 程式人生 > >coreutils4.5.1 basename.c原始碼分析3

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';
把檔名中末尾和字尾相等的部分直接去掉。
作者對字串處理的部分出神入化,不佩服都不行呀。