문제

나는 내 자신의 strtok 버전을 개발했습니다.포인터 사용을 연습하기 위해서입니다.

누구든지 이것에 대한 제한 사항을 볼 수 있습니까? 아니면 어쨌든 개선할 수 있습니다.

void stvstrtok(const char *source, char *dest, const char token) 
{
    /* Search for the token. */
    int i = 0;
    while(*source)
    {
        *dest++ = *source++;
        if(*source == token)
        {
            source++;
        }
    }
    *dest++ = '\0';
    }

int main(void)
{
    char *long_name = "dog,sat ,on ,the,rug,in ,front,of,the,fire";
    char buffer[sizeof(long_name)/sizeof(*long_name)];

    stvstrtok(long_name, buffer, ',');

    printf("buffer: %s\n", buffer);

   getchar();

   return 0;
}
도움이 되었습니까?

해결책

참고 사항:'토큰'이라는 단어는 일반적으로 반환되는 문자열 부분을 설명하는 데 사용됩니다.구분 기호는 토큰을 구분하는 것을 설명하는 데 사용됩니다.따라서 코드를 더 명확하게 만들려면 토큰의 이름을 구분 기호로 바꾸고 dest의 이름을 token_dest로 바꿔야 합니다.

함수와 strtok의 차이점:

함수와 strtok 사이에는 몇 가지 차이점이 있습니다.

  • 귀하의 기능은 단순히 토큰 구분 기호를 제거하는 것입니다.
  • 문자열의 모든 부분을 처리하려면 함수를 한 번만 호출하면 됩니다.strtok를 사용하면 문자열의 각 부분에 대해 여러 번 호출합니다(이후 첫 번째 매개변수로 NULL을 사용하여 호출).
  • strtok은 또한 소스 문자열을 파괴하는 반면, 코드는 자체 버퍼를 사용합니다(당신처럼 자체 버퍼를 사용하는 것이 더 낫다고 생각합니다).
  • strtok은 첫 번째 매개변수가 NULL인 각 호출 후에 다음 토큰의 위치를 ​​저장합니다.이 위치는 후속 통화에 사용됩니다.그러나 이는 스레드로부터 안전하지 않으며 귀하의 함수는 스레드로부터 안전할 것입니다.
  • strtok에서는 여러 개의 서로 다른 구분 기호를 사용할 수 있지만 코드에서는 하나만 사용합니다.

즉, strtok의 구현에 더 가까운 기능이 아닌 더 나은 기능을 만드는 방법에 대한 제안을 제공할 것입니다.

기능을 개선하는 방법(strtok을 에뮬레이트하지 않음):

제 생각에는 다음과 같이 변경하는 것이 더 좋을 것 같습니다.

  • 함수가 단순히 '다음' 토큰을 반환하도록 하세요.
  • *source 또는 *source == 구분 기호가 있는 경우 루프에서 벗어나세요.
  • 다음 토큰이 포함된 소스 문자열의 첫 번째 문자에 대한 포인터를 반환합니다.이 포인터는 후속 호출에 사용될 수 있습니다.

다른 팁

이 코드는 전혀 작동하지 않습니다 strtok(). 정확히 무엇을하려고 했습니까? 그러나 개선에 관한 한, 코드는 심각한 버그가 있습니다. source 발생 횟수로 빼기 token 길이보다 큽니다 dest 당신은 자신에게 매우 고전적인 것을 가지고 있습니다 스택 오버플로, 그것은 현재 나에게 다소 아이러니 한 것 같습니다. 이것은 발생하지 않습니다 main 당신이 사용했지만 다른 곳에서 기능을 사용하는 것은 당신을 불확실성의 길과 절망의 경로로 인도 할 수밖에 없습니다.

Strtok을 사용하면 모든 토큰을 반복 할 수 있습니다. 소스 문자열이 쓰기 가능하고 토큰 브레이크에서 널을 삽입한다고 가정함으로써이를 수행합니다. 대상 버퍼는 소스 버퍼와 함께 문자 오프셋에 대한 포인터입니다. 이 사실을 사용하여 End +에 도달했을 때를 알 수 있습니다.

strtok은 소스 문자열을 파괴하기 때문에 사용하기에 좋은 기능이 아닙니다. 또한 재진입하지 않습니다.

strtok ()는 일부 상태를 저장하므로 여러 번 호출하여 여러 토큰을 얻을 수 있습니다. 또한 strtok ()는 소스 문자열을 "분할"하여 여러 대상 문자열을 얻을 수 있습니다.

내가 보는 모든 코드는 토큰 Seperator와 같은 입력 숯을 무시하고 소스의 무효 종결에 계속 복사하는 것입니다.

편집 : 또한 두 가지 시퀀싱 토큰-시퍼레이터가 있다고 생각합니다. 첫 번째는 기능에 의해 무시되고, 두 번째는 대상에 기록되는 반면, strtok ()는 단일 분리기 (MAN)로서 2 개 이상의 구분자의 seqeunce를 정의합니다. 페이지: http://man.cx/?page=strtok )

Strtok은 NUL 문자로 입력 문자열을 파괴하여 적대적입니다.

또한 "XYZ, PDQ"의 경우를 고려해야합니다.

이 경우 기능이 무엇을 원하십니까?

또한 Strtok (...)는 여러 구분 기호 문자를 지원합니다. strtok (...)를 재 구현하는 데 사용할 수 있으므로 strspn (...) 및 strcspn (...)의 정의를 살펴보십시오.

그건 그렇고, long_name은 char에 대한 포인터이며 (long_name)은 sizeof (char*)입니다. long_name이 가리키는 크기는 아닙니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top