硬编码ls调用execvp正常,读取输入的ls却失效的技术求助
解决execvp硬编码正常、输入传参失败的问题
嘿,我之前踩过一模一样的坑!这种情况90%是两个小细节没处理好——要么是输入的字符串藏了看不见的换行符,要么是你的参数数组没正确以NULL结尾,咱们一步步捋清楚:
1. 排查输入字符串的隐藏换行符
如果是用fgets()这类函数读取输入,它会把你按下的回车(也就是换行符\n)也一起读进字符串里。这时候你以为arguments[0]是"ls",但实际它是"ls\n"——execvp会去搜索名为ls\n的命令,自然找不到。
解决方法很简单,读完输入后把末尾的换行符去掉:
char cmd[100]; fgets(cmd, sizeof(cmd), stdin); // 用strcspn直接定位换行符的位置,替换成字符串结束符 cmd[strcspn(cmd, "\n")] = '\0';
你也可以加个调试打印,直观看看字符串内容:
printf("arguments[0] is: '%s'\n", arguments[0]);
如果输出是'ls '(引号里ls后面跟着换行),那肯定是换行符的锅。
2. 确认参数数组以NULL结尾
execvp的第二个参数要求是以NULL指针结尾的字符串数组。硬编码时你大概率写了:
char *args[] = {"ls", "-la", NULL};
但从输入构建数组的时候,很容易忘了加最后那个NULL。如果数组没以NULL结尾,execvp会越界读取内存,行为完全不可预测,大概率就是执行失败。
3. 用perror快速定位错误
实在搞不清的话,在execvp后面加个错误打印:
if (execvp(arguments[0], arguments) == -1) { perror("execvp failed"); exit(EXIT_FAILURE); }
如果是找不到命令,会输出execvp failed: No such file or directory;如果是数组格式问题,可能会输出其他错误信息,直接帮你锁定问题。
内容的提问来源于stack exchange,提问作者zach adams
相关产品推荐
相关产品推荐

