source

C - 문자열을 문자열 배열로 분할

manycodes 2023. 7. 30. 17:56
반응형

C - 문자열을 문자열 배열로 분할

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)

다음은 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 );
    }
}

언급URL : https://stackoverflow.com/questions/11198604/c-split-string-into-an-array-of-strings

반응형