You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

批量修改文件后缀代码中strcmp判断语句的工作原理疑问

代码中!strcmp(ext + 1, argv[1])的工作原理

咱们一步步拆解这行代码的逻辑:

  1. strrchr(dir->d_name, '.')的作用
    strrchr函数会在文件名dir->d_name里从后往前找第一个.的位置,返回指向这个.的指针。比如文件名是holiday.JPG,ext就指向字符串里的.,ext + 1就是把指针往后挪一位,指向J——也就是文件后缀的第一个字符,对应的字符串就是"JPG"。

  2. strcmp与!的组合逻辑
    strcmp(a, b)是C标准库的字符串比较函数:

    • 如果a和b完全相同,返回0
    • 如果a比b字典序小,返回负数;反之返回正数

    这里前面加了!(逻辑非),意思是当strcmp返回0(也就是后缀和argv[1]完全匹配)时,条件为真,才会进入后续的重命名逻辑。

    对应你说的传入参数"JPG jpg"的场景:argv[1]是"JPG",当遍历到后缀为JPG的文件时,ext+1指向的字符串就是"JPG",和argv[1]完全一致,strcmp返回0,!0为真,所以会执行重命名操作,把后缀改成argv[2]的"jpg"。

补充几个潜在问题(当年作业可能没注意到)

  • 如果遇到没有后缀的文件(比如readme),strrchr会返回NULL,直接访问ext + 1会导致程序崩溃,应该先判断ext != NULL再进入后续逻辑。
  • 这段代码是大小写敏感的,比如jpg和JPG会被当成不同后缀,如果你想做不区分大小写的匹配,得用strcasecmp(POSIX标准)或者自己实现大小写转换后比较。
  • char name[strlen(dir->d_name)];的长度不够安全:原文件名长度是strlen(dir->d_name),去掉旧后缀再加新后缀后,总长度可能超过这个值,会触发缓冲区溢出,应该用strlen(dir->d_name) - strlen(ext) + strlen(argv[2]) + 1来计算数组长度(加1是给字符串结束符\0留位置)。

内容的提问来源于stack exchange,提问作者Wittfogel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 03:22:44