我有一个简单的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"); // This is what is being printed
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); // 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;
}所需产出:
PANDA当前产出:
Returned from execv call.发布于 2022-08-24 18:45:17
您可能需要从打印errno并查看它的内容开始。
我怀疑原因是凯撒密码不在当前目录中,而且您没有指定完整的路径。有execvp来考虑$PATH。
哦,另一个特性是:您可能希望使用NULL而不是"\0“作为argv的结尾。
发布于 2022-08-24 18:49:38
来自man页面:
指针数组必须由空指针__终止。
因此,不应该有指针指向以空结尾的字符串,如下所示:
argv[2] = "\0";它应该是:
argv[2] = NULL;似乎忽略了这个电话
它试图在数组中找到NULL指针--但它不知道数组的结束位置--因此,就会从未定义行为中读取超出界限的内容。它可能从execv返回(表示故障),但也可能已经崩溃或做了更糟的事情。
https://stackoverflow.com/questions/73478173
复制相似问题