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

C语言execv函数调用cat命令时传入的文件名参数不生效问题

问题根因

你遇到的问题核心是strncmp比对逻辑的漏洞,加上输入的fileName参数末尾存在不可见字符(最常见为换行符):

  • 你调用strncmp(fileName, "junk.txt", strlen("junk.txt"))时,仅比对了前8个字符(junk.txt的长度为8),哪怕fileName实际内容是junk.txt\n(末尾多了一个换行符),前8个字符完全一致也会返回0,让你误以为两个字符串完全相等,但实际传入execv的文件名多了不可见字符,系统自然找不到对应文件。

排查验证方法

你可以加一行打印代码确认fileName的实际内容:

// 打印fileName的每个字符的ASCII值,排查末尾是否有多余字符
for (int i=0; fileName[i]!= '\0'; i++) {
    printf("char %d: %d (%c)\n", i, fileName[i], fileName[i] >= 32 ? fileName[i] : '.');
}

如果参数是从标准输入读取的,大概率是用fgets读入时,把末尾的换行符\n(ASCII值10)也存入了fileName。

修复方案

如果确认是末尾多了换行符,在传给execv之前先把末尾的换行符去掉即可:

// 移除末尾的换行符
size_t len = strlen(fileName);
if (len > 0 && fileName[len-1] == '\n') {
    fileName[len-1] = '\0';
}

另外如果要准确判断两个字符串是否完全相等,建议直接用strcmp而不是strncmp,strcmp会比对到两个字符串的\0结束符为止,不会出现截断比对的误判。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 20:09:02