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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章