对有界字符使用execvp*

对有界字符使用execvp*,c,pointers,exec,C,Pointers,Exec,我有: char * tokens[50][2]; 在此设置中,标记[i][0]指向参数的开头,标记[i][1]指向参数的结尾。这些令牌不是空终止的。要打印它们,我正在使用: printf("%.*s ",(int)(com->tokens[i][1] - com->tokens[i][0] + 1), com->tokens[i][0]); 现在我需要使用它们来执行一个函数。我正试图与execvp合作。如果可能的话,我试图避免为这些字符串分配内存。有没有办法将有界字

我有:

char * tokens[50][2];  
在此设置中,标记[i][0]指向参数的开头,标记[i][1]指向参数的结尾。这些令牌不是空终止的。要打印它们,我正在使用:

printf("%.*s ",(int)(com->tokens[i][1] - com->tokens[i][0] + 1), com->tokens[i][0]); 
现在我需要使用它们来执行一个函数。我正试图与execvp合作。如果可能的话,我试图避免为这些字符串分配内存。有没有办法将有界字符串作为参数发送?有什么想法吗?

因为
execvp()
只适用于以null结尾的字符串,所以您要么必须以null结尾字符串,要么……实际上,没有or选项,因为所有系统调用都使用以null结尾的字符串

确定:另一种方法是创建以null结尾的字符串副本,并使用副本调用
execvp()。因为您知道它们有多长,所以您将能够相当有效地完成这项工作—但您需要分配足够的内存

size_t req_size = 0;
for (int i = 0; i < n; i++)
    req_size += (com->tokens[i][1] - com->tokens[i][0] + 2);
char **argv = malloc((n + 1) * sizeof(argv[0]));
char *args = malloc(req_size);
if (argv == 0 || args == 0)
    …report memory allocation failure; do not continue…
char *argp = args;
int i;
for (i = 0; i < n; i++)
{
    size_t len_i = com->tokens[i][1] - com->tokens[i][0] + 1;
    argv[i] = argp;
    memmove(argv[i], com->tokens[i][0], len_i);
    argv[i][len_i] = '\0';
    argp += len_i + 1;
}
assert(argp == args + req_size);
argv[i] = 0;                      // Null terminate list of pointers

execvp(argv[0], argv);
size\u t req\u size=0;
对于(int i=0;itokens[i][1]-com->tokens[i][0]+2);
字符**argv=malloc((n+1)*sizeof(argv[0]);
char*args=malloc(请求大小);
如果(argv==0 | | args==0)
…报告内存分配失败;不要继续…
char*argp=args;
int i;
对于(i=0;itokens[i][1]-com->tokens[i][0]+1;
argv[i]=argp;
memmove(argv[i],com->tokens[i][0],len_i);
argv[i][len_i]='\0';
argp+=len_i+1;
}
断言(argp==args+req\u大小);
argv[i]=0;//指针的Null终止列表
execvp(argv[0],argv);
嵌入SSCCE()中的代码:

#包括
#包括
#包括
#包括
结构命令
{
int n;
char*代币[50][2];
};
静态无效打印\u已修复(struct命令*com)
{
printf(“固定:\n”);
printf(“%d:”,com->n);
对于(inti=0;in;i++)
printf(“[%.*s]”,(int)(com->tokens[i][1]-com->tokens[i][0]+1),com->tokens[i][0]);
putchar('\n');
}
静态无效打印_argv(整型argc,字符**argv)
{
printf(“argv:\n”);
对于(int i=0;i n;
打印固定(com);
尺寸要求尺寸=0;
对于(int i=0;itokens[i][1]-com->tokens[i][0]+2);
字符**argv=malloc((n+1)*sizeof(argv[0]);
char*args=malloc(请求大小);
如果(argv==0 | | args==0)
{
fprintf(stderr,“内存分配失败”);
出口(1);
}
char*argp=args;
int i;
对于(i=0;itokens[i][1]-com->tokens[i][0]+1;
argv[i]=argp;
memmove(argv[i],com->tokens[i][0],len_i);
argv[i][len_i]='\0';
argp+=len_i+1;
}
断言(argp==args+req\u大小);
argv[i]=0;//Null终止指针列表
打印argv(i,argv);
返回0;
}
输出:

fixed:
5: [command] [arg1] [arg2] [arg3] [arg4]
argv:
0: [command]
1: [arg1]
2: [arg2]
3: [arg3]
4: [arg4]
5: [<<NULL pointer>>]
已修复:
5:[命令][arg1][arg2][arg3][arg4]
argv:
0:[命令]
1:[arg1]
2:[arg2]
3:[arg3]
4:[arg4]
5: []
fixed:
5: [command] [arg1] [arg2] [arg3] [arg4]
argv:
0: [command]
1: [arg1]
2: [arg2]
3: [arg3]
4: [arg4]
5: [<<NULL pointer>>]