C中的Execv函数未读取作为参数传入的变量

因此,我正在构建自己的shell,我想要的命令之一是"猫;作用为此,我使用execv函数并传入正确的bin路径"猫;以及我想要连接并打印到终端的文件名

下面的代码工作得非常好,但我正在用我想要的文件名进行硬编码;猫

void cat(char*fileName)
{
char*bin_path="/bin/cat";
printf("%d\n",strncmp(文件名为“junk.txt”,strlen("junk.txt));//返回0,表示相等的值
char*args[]={bin_path,"junk.txt",NULL};
execv(bin_路径,args);
}

上面的输出如下所示
参数是硬编码的

但是我希望能够使这个函数成为动态的,并将文件名传递到函数中,这就是为什么我将变量fileName作为参数的原因。您可以看到,我正在比较字符串literal"垃圾文件“;使用fileName变量,返回0,表示它们相等!但是当我将变量fileName传递给execv函数时,它就不起作用了。请看下面我的坏代码

void cat(char*fileName)
{
char*bin_path="/bin/cat";
printf("%d\n",strncmp(文件名为“junk.txt”,strlen("junk.txt));//返回0,表示相等的值
char*args[]={bin_路径,文件名,NULL};
execv(bin_路径,args);
}

没有与该名称匹配的文件或目录

有人知道为什么吗

很可能您将文件名作为一整行读取,并在行尾获得新行字符strncmp只比较您告诉它的字符数,因此零结果不能证明字符串相等。我们甚至可以在cat的错误消息中看到新行:在“junk.txt”之后,它的“:”位于新行上

更改调用例程以从名称中删除不需要的新行字符

在将来,始终提供一个最小的可重复的示例,其中包含调试问题。本例中的错误出现在调用例程中未显示的代码中,这就是为什么应始终提供MRE的原因

发表评论