这个程序的重点是重命名当前目录中所有文件的文件扩展名。
这是一些代码:
while ((dir = readdir(d)) != NULL)
{
char *ext = strrchr(dir->d_name, '.');
if (!strcmp(ext + 1, argv[1])) // :)
{
char name[strlen(dir->d_name)];
strcpy(name, dir->d_name);
name[strlen(name) - strlen(ext) + 1] = '\0'; // :)
strcat(name, argv[2]);
if (rename(dir->d_name, name) != 0)
{
syslog(LOG_ALERT, "Could not rename file %s!", dir->d_name);
}
}
}
我不久前这样做了,但我不明白为什么 strcmp if 语句有效。在我看来这很疯狂。
但是,使用参数“JPG jpg”调用它确实会重命名 JPG 文件。
这里有什么黑暗艺术在起作用?
提前谢谢您。
strcmp()
返回一个整数值,当作为操作数应用于布尔运算符(例如 !
)时,整数会隐式转换为布尔值。
转换为零到
false
,非零到true
。
因此
!strcmp(ext + 1, argv[1])
在语义上与 strcmp(ext + 1, argv[1]) == 0
相同。
这并不疯狂,对于那些喜欢简洁而不是清晰的人来说,这是一个非常常见的习语。您还经常看到它应用于指针来测试
NULL
。我一般建议不要这样做。
我们来拆解一下吧。
if(!strcmp(ext + 1, argv[1]))
ext + 1 是指向扩展名第一个字符的指针,argv[1] 指向命令行输入的开头。
strcmp 会比较两个字符串,如果发现相同,则返回 0。
如果 x 等于 0,则逻辑非
!x == 1
;否则!x == 0
。
在if语句中,我们会遇到IF的拥抱,条件是NOT0。
因此,当文件扩展名与您的命令行输入匹配时,此语句将进行重命名。
这句话的哪一部分让你感到困惑?