无法将用户输入数组传递给 execvp
Unable to pass a user input array to execvp
这是我的输入函数:
int i,j,n,len,c;
char *buffer = 0;
size_t bufsize = 0;
ssize_t characters;
characters = getline(&buffer, &bufsize, stdin);
len = strlen(buffer);
buffer[len-1]='[=10=]';
if (characters > 0)
{
char *end_str1;
char *token1 = strtok_r(buffer, ";", &end_str1);
int count = 0, wordcnt;
while (token1 != NULL)
{
char cmd[10][101];
memset(cmd,0,sizeof(cmd));
wordcnt = 0;
char *end_str2;
count++;
char *token2 = strtok_r(token1, " ", &end_str2);
while (token2 != NULL)
{
n = strlen(token2);
strncpy(cmd[wordcnt],token2,n);
wordcnt++;
token2 = strtok_r(NULL, " ", &end_str2);
}
cmd[wordcnt+1][0]='[=10=]';
execvp(cmd[0],cmd);
token1 = strtok_r(NULL, ";", &end_str1);
}
}
free(buffer);
唯一的警告是指针类型不兼容,但我的cmd数组是一个**ptr,所以我不明白哪里出了问题。
我尝试将它等同于 **k,然后将其传递给 execvp。没用。
我尝试将 cmd 更改为 **cmd,我认为我在那里做错了,因为它应该有效但没有。
这是因为您向函数 execvp 传递了错误的参数。
execvp(cmd[0],cmd); //this line
它的声明是这样的:
extern int execvp (const char *__file, char *const __argv[])
并且您正在传递 char (*)[101] 类型的参数,它期望 char *, const*
因此抛出不兼容的错误。
my cmd
array is a [char] **ptr
不,不是。
它是一个 char[10][100]
,当传递给 execvp()
时,它会衰减到指向其第一个元素的指针,即 char(*)[101]
。
这里还有一个 "off-by-one" 错误:
cmd[wordcnt+1][0]='[=10=]';
wordcnt
已经在标记化循环中递增。
你想要的是:
#define MAX_NO_OF_CMD_ELEMENTS (10)
...
char * cmd[MAX_NO_OF_CMD_ELEMENTS + 1]; /* 1+ for the NULL-terminator */
size_t wordcnt = 0;
char *end_str2;
count++;
token2 = strtok_r(token1, " ", &end_str2);
while ((NULL != token2)
&& (MAX_NO_OF_CMD_ELEMENTS > wordcnt)) /* Prevent writing
out of `cmd`'s bounds. */
{
cmd[wordcnt] = token2;
wordcnt++;
token2 = strtok_r(NULL, " ", &end_str2)
}
cmd[wordcnt] = NULL;
execvp(cmd[0], cmd);
Also^2 getline()
returns 一个以 0
结尾的 char
数组(一个 "string")。不需要这个
len = strlen(buffer);
buffer[len-1]='[=12=]';
这是我的输入函数:
int i,j,n,len,c;
char *buffer = 0;
size_t bufsize = 0;
ssize_t characters;
characters = getline(&buffer, &bufsize, stdin);
len = strlen(buffer);
buffer[len-1]='[=10=]';
if (characters > 0)
{
char *end_str1;
char *token1 = strtok_r(buffer, ";", &end_str1);
int count = 0, wordcnt;
while (token1 != NULL)
{
char cmd[10][101];
memset(cmd,0,sizeof(cmd));
wordcnt = 0;
char *end_str2;
count++;
char *token2 = strtok_r(token1, " ", &end_str2);
while (token2 != NULL)
{
n = strlen(token2);
strncpy(cmd[wordcnt],token2,n);
wordcnt++;
token2 = strtok_r(NULL, " ", &end_str2);
}
cmd[wordcnt+1][0]='[=10=]';
execvp(cmd[0],cmd);
token1 = strtok_r(NULL, ";", &end_str1);
}
}
free(buffer);
唯一的警告是指针类型不兼容,但我的cmd数组是一个**ptr,所以我不明白哪里出了问题。
我尝试将它等同于 **k,然后将其传递给 execvp。没用。 我尝试将 cmd 更改为 **cmd,我认为我在那里做错了,因为它应该有效但没有。
这是因为您向函数 execvp 传递了错误的参数。
execvp(cmd[0],cmd); //this line
它的声明是这样的:
extern int execvp (const char *__file, char *const __argv[])
并且您正在传递 char (*)[101] 类型的参数,它期望 char *, const*
因此抛出不兼容的错误。
my
cmd
array is a[char] **ptr
不,不是。
它是一个 char[10][100]
,当传递给 execvp()
时,它会衰减到指向其第一个元素的指针,即 char(*)[101]
。
这里还有一个 "off-by-one" 错误:
cmd[wordcnt+1][0]='[=10=]';
wordcnt
已经在标记化循环中递增。
你想要的是:
#define MAX_NO_OF_CMD_ELEMENTS (10)
...
char * cmd[MAX_NO_OF_CMD_ELEMENTS + 1]; /* 1+ for the NULL-terminator */
size_t wordcnt = 0;
char *end_str2;
count++;
token2 = strtok_r(token1, " ", &end_str2);
while ((NULL != token2)
&& (MAX_NO_OF_CMD_ELEMENTS > wordcnt)) /* Prevent writing
out of `cmd`'s bounds. */
{
cmd[wordcnt] = token2;
wordcnt++;
token2 = strtok_r(NULL, " ", &end_str2)
}
cmd[wordcnt] = NULL;
execvp(cmd[0], cmd);
Also^2 getline()
returns 一个以 0
结尾的 char
数组(一个 "string")。不需要这个
len = strlen(buffer);
buffer[len-1]='[=12=]';