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
相关产品推荐
相关产品推荐

