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