C 和 strcmp() 函数 [已关闭]

问题描述 投票:0回答:2

这个程序的重点是重命名当前目录中所有文件的文件扩展名。

这是一些代码:

 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 文件。

这里有什么黑暗艺术在起作用?

提前谢谢您。

c strcmp
2个回答
4
投票

strcmp()
返回一个整数值,当作为操作数应用于布尔运算符(例如
!
)时,整数会隐式转换为布尔值。

转换为零到

false
,非零到
true

因此

!strcmp(ext + 1, argv[1])
在语义上与
strcmp(ext + 1, argv[1]) == 0
相同。

这并不疯狂,对于那些喜欢简洁而不是清晰的人来说,这是一个非常常见的习语。您还经常看到它应用于指针来测试

NULL
。我一般建议不要这样做。


3
投票

我们来拆解一下吧。

if(!strcmp(ext + 1, argv[1]))
  1. ext + 1 是指向扩展名第一个字符的指针,argv[1] 指向命令行输入的开头。

  2. strcmp 会比较两个字符串,如果发现相同,则返回 0。

  3. 如果 x 等于 0,则逻辑非

    !x == 1
    ;否则
    !x == 0

  4. 在if语句中,我们会遇到IF的拥抱,条件是NOT0。

因此,当文件扩展名与您的命令行输入匹配时,此语句将进行重命名。

这句话的哪一部分让你感到困惑?

© www.soinside.com 2019 - 2024. All rights reserved.