这是我的输入功能:
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]='\0';
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]='\0';
execvp(cmd[0],cmd);
token1 = strtok_r(NULL, ";", &end_str1);
}
}
free(buffer);
唯一的警告是指针类型不兼容,但是我的cmd数组是** ptr,所以我不明白是什么问题。
我尝试将其等同于** k,然后将其传递给execvp。没工作。 我尝试将cmd更改为** cmd,我认为我在那里做错了,因为它应该有效,但事实并非如此。
答案 0 :(得分:1)
我的
[char] **ptr
数组是char[10][100]
不,不是。
它是execvp()
,当传递给char(*)[101]
时,它会衰减到指向其第一个元素的指针,即cmd[wordcnt+1][0]='\0';
。
你也有一个"一个一个"错误在这里:
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);
已在令牌化循环内增加。
你想要的是:
getline()
同样^ 2 0
已经返回char
- 已终止的 len = strlen(buffer);
buffer[len-1]='\0';
- 数组("字符串")。不需要这个
{{1}}
答案 1 :(得分:0)
因为您将错误的参数传递给函数execvp。
execvp(cmd[0],cmd); //this line
它的声明是这样的:
extern int execvp (const char *__file, char *const __argv[])
并且你传递的是char(*)[101]类型的参数,它期望char *, const*
因此抛出不兼容的错误。