Я не совсем уверен, как это сделать в C:
char* curToken = strtok(string, ";");
//curToken = "ls -l" we will say
//I need a array of strings containing "ls", "-l", and NULL for execvp()
Как мне это сделать?
Я не совсем уверен, как это сделать в C:
char* curToken = strtok(string, ";");
//curToken = "ls -l" we will say
//I need a array of strings containing "ls", "-l", and NULL for execvp()
Как мне это сделать?
Поскольку вы уже рассмотрели strtok
, просто продолжайте идти по тому же пути и разделите строку, используя пробел (' '
) в качестве разделителя, затем используйте что-то вроде realloc
, чтобы увеличить размер массива, содержащего элементы, которые будут переданы в execvp
.
См. приведенный ниже пример, но имейте в виду, что strtok
изменит переданную ему строку. Если вы не хотите, чтобы это произошло, вам необходимо сделать копию исходной строки, используя strcpy
или аналогичную функцию.
char str[]= "ls -l";
char ** res = NULL;
char * p = strtok (str, " ");
int n_spaces = 0, i;
/* split string and append tokens to 'res' */
while (p) {
res = realloc (res, sizeof (char*) * ++n_spaces);
if (res == NULL)
exit (-1); /* memory allocation failed */
res[n_spaces-1] = p;
p = strtok (NULL, " ");
}
/* realloc one extra element for the last NULL */
res = realloc (res, sizeof (char*) * (n_spaces+1));
res[n_spaces] = 0;
/* print the result */
for (i = 0; i < (n_spaces+1); ++i)
printf ("res[%d] = %s\n", i, res[i]);
/* free the memory allocated */
free (res);
res[0] = ls
res[1] = -l
res[2] = (null)
/* realloc one extra element for the last NULL */
? мне трудно это понять
- person Abdul; 16.10.2015
res
, я получу предупреждение после освобождения указателя, которому я назначил res
, говоря: warning: attempt to free a non-heap object [-Wfree-nonheap-object]
. Есть ли у вас понимание причины?
- person MattSom; 02.05.2020
Вот пример использования strtok а> заимствовано из MSDN.
И соответствующие биты вам нужно вызывать несколько раз. token
char* — это та часть, которую вы бы вставили в массив (вы можете понять эту часть).
char string[] = "A string\tof ,,tokens\nand some more tokens";
char seps[] = " ,\t\n";
char *token;
int main( void )
{
printf( "Tokens:\n" );
/* Establish string and get the first token: */
token = strtok( string, seps );
while( token != NULL )
{
/* While there are tokens in "string" */
printf( " %s\n", token );
/* Get next token: */
token = strtok( NULL, seps );
}
}
token = strtok(NULL, seps);
? Почему NULL
?
- person Charles; 18.11.2015
NULL
.
- person Chris O; 18.11.2015
strtok()
использует статическую переменную, чтобы сохранить свое место.
- person Charles; 18.11.2015
;
в качестве разделителя? - person Oliver Charlesworth   schedule 26.06.2012