35

Cでこれを行う方法が完全にはわかりません:

char* curToken = strtok(string, ";");
//curToken = "ls -l" we will say
//I need a array of strings containing "ls", "-l", and NULL for execvp()

どうすればこれを行うことができますか?

4

2 に答える 2

63

既に調べたので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)
于 2012-06-25T23:03:21.070 に答える
7

MSDN から借用したstrtok の使用例を次に示します。

関連するビットは、複数回呼び出す必要があります。tokenchar* は、配列に詰め込む部分です (その部分は理解できます) 。

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 );
    }
}
于 2012-06-25T23:05:17.817 に答える