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

execv调用未执行凯撒解密程序,请求排查解决

问题与解决方案

我编写了一个简单的C程序,按照execv()第二个参数的要求构建参数数组,调用一个用于计算并输出凯撒密码解密结果的程序。但调用execv()的文件似乎忽略了该调用,直接执行后续代码,请问该如何解决?

代码

execv-test-arg.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main (void)
{
        char *argv[3];
        argv[0] = "caesar-cipher";
        argv[1] = "SDQGD";
        argv[2] = "\0";
        execv("caesar-cipher",argv);
        printf("Returned from execv call.\n"); // 此语句被打印
        return 0;
}

caesar-cipher.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main (int argc, char *argv[])
{
   int i, j;

   for (i=1; i<argc; i++) {
      j=0;
      while (argv[i][j] != '\0') {
         if ((argv[i][j] >= 'A') && (argv[i][j] <= 'Z')) {
            printf ("%c", 'A'+(argv[i][j]-'A'+23)%26); // 预期输出内容
         }
         else if ((argv[i][j] >= 'a') && (argv[i][j] <= 'z')) {
            printf ("%c", 'A'+(argv[i][j]-'a'+23)%26);
         }
         else if ((argv[i][j] >= '0') && (argv[i][j] <= '9')) {
            printf ("%c", '0'+(argv[i][j]-'0'+7)%10);
         }
         else printf ("Invalid input.\n");
         j++;
      }
      printf(" ");
   }
   printf("\n");
   return 0;
}

预期输出

PANDA

当前输出

Returned from execv call.

解决方法

execv()只有在调用失败时才会返回,后续代码执行说明调用未成功,问题出在以下两点:

  1. 参数数组结尾错误
    execv要求argv数组必须以NULL指针结尾,而非指向空字符串的"\0"。你写的argv[2] = "\0";是指向空字符串的指针,不符合规范,应改为argv[2] = NULL;。

  2. 程序路径未指定正确
    execv不会搜索环境变量PATH,必须指定程序的相对路径或完整路径。如果caesar-cipher在当前工作目录,要写成./caesar-cipher,而非仅写程序名。

  3. 添加错误排查(可选但实用)
    在execv调用后添加错误信息打印,方便定位问题,比如使用perror。

修改后的execv-test-arg.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>

int main (void)
{
        char *argv[3];
        argv[0] = "caesar-cipher";
        argv[1] = "SDQGD";
        argv[2] = NULL; // 修正为NULL指针
        execv("./caesar-cipher", argv); // 指定当前目录下的程序路径
        perror("execv failed"); // 打印具体错误原因
        printf("Returned from execv call.\n");
        return EXIT_FAILURE; // 调用失败返回非0状态码
}

另外需确保caesar-cipher已正确编译并拥有执行权限:

gcc caesar-cipher.c -o caesar-cipher
chmod +x caesar-cipher # 若权限不足则执行此命令

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 22:03:39