首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带参数数组的Execv

带参数数组的Execv
EN

Stack Overflow用户
提问于 2022-08-24 18:40:02
回答 2查看 53关注 0票数 0

我有一个简单的C程序,它按照execv()的第二个参数的要求创建一个参数数组,它执行一个程序,该程序计算并输出参数的凯撒密码解码。但是,调用execv()的文件似乎忽略了调用,并向前移动。我该怎么办?

代码

execv-test-arg.c:

代码语言:javascript
复制
#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"); // This is what is being printed
        return 0;
}

caesar-cipher.c

代码语言:javascript
复制
#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); // To be printed
         }
         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;
}

所需产出:

代码语言:javascript
复制
PANDA

当前产出:

代码语言:javascript
复制
Returned from execv call.
EN

回答 2

Stack Overflow用户

发布于 2022-08-24 18:45:17

您可能需要从打印errno并查看它的内容开始。

我怀疑原因是凯撒密码不在当前目录中,而且您没有指定完整的路径。有execvp来考虑$PATH

哦,另一个特性是:您可能希望使用NULL而不是"\0“作为argv的结尾。

票数 1
EN

Stack Overflow用户

发布于 2022-08-24 18:49:38

来自man页面:

指针数组必须由空指针__终止。

因此,不应该有指针指向以空结尾的字符串,如下所示:

代码语言:javascript
复制
argv[2] = "\0";

它应该是:

代码语言:javascript
复制
argv[2] = NULL;

似乎忽略了这个电话

它试图在数组中找到NULL指针--但它不知道数组的结束位置--因此,就会从未定义行为中读取超出界限的内容。它可能从execv返回(表示故障),但也可能已经崩溃或做了更糟的事情。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73478173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档