2016-09-23 3 views
-3

문자열 (예 : "hey there mister")을 문장의 모든 단어를 가리키는 이중 포인터로 변환하려고합니다. so : split_string-> | pointer1 | pointer2 | pointer3 | 여기서 pointer1 -> "hey", pointer2 -> "there"및 pointer3 -> "mister".문자열을 C에서 이중 포인터로 분할

제 질문은 왜 작동하지 않습니까? '\0'에 대한

char str[strlen(s)]; //size should be equal to strlen(s)+1 

추가 1 -

+0

프로그램에서 어느 시점에서 생각하고있는 것을하지 못하고 있습니까? – RPGillespie

+0

이 문맥에서 "효과가 없다"는 것을 알려주세요. 당신은 어떤 결과물을 얻고 있습니까? –

+2

박쥐를 똑바로 뽑아 보면, 이것은 매우 의심스러워 보입니다 :'char ** nystreng = malloc (strlen (s));'. 필요한 공간이's'의 길이와 같고'char * '의 크기와 독립적 인 이유는 분명하지 않습니다. –

답변

1

코드에 여러 가지 문제가 있습니다. 그 중 :

  • char **nystreng = malloc(strlen(s));은 잘못된 것입니다. 필요한 공간의 크기는 char *의 크기와 문자열이 분할 될 숫자 조각에 1을 더한 것 (NULL 포인터 종결 자의 경우)입니다.

  • 당신은 지역 배열 str에 운영 strtok()에서 얻은 포인터 *nystreng을 입력합니다. 이러한 포인터는 수명이 str 인 경우에만 유효하며 함수가 반환 될 때 끝납니다.

  • 문자열 터미네이터의 공간을 str에 할당하지 않고 문자를 쓰지 않고 종료 된 문자열 인 것처럼 strtok()에 전달합니다.

  • 토큰 화 루프 내에서 teller을 증가시키지 않으므로 각 토큰 포인터가 이전 토큰을 덮어 씁니다.

문자열을 분할하기 전에 얼마나 많은 조각이 있는지 모르기 때문에 필수적인 문제가 있습니다. 그럼에도 불구하고 구분 기호 문자의 수를 세고 1을 더함으로써 상한선을 얻을 수 있습니다. 그런 다음 많은 수의 char 포인터에 1을 더한 공간을 할당 할 수 있습니다. 또는 토큰화할 때 연결 목록을 작성하여 조각을 처리 한 다음 몇 개의 조각이 있는지 알 고 난 후에 결과 배열을 할당 할 수 있습니다.

str에 대해서는 포인터를 반환하려는 경우 분명히 그렇듯이 동적으로 할당해야합니다. 플랫폼이 strdup()를 제공하는 경우에 당신은 당신이 (터미네이터위한 공간 포함) malloc()에 충분한 공간을 할당, 길이를 확인해야하고, 할당 된 공간에 입력 문자열을 복사거야, 그렇지 않으면

char *str = strdup(s); 

를 사용할 수 있습니다 , 아마 strcpy().일반적으로 문자열을 나중에 비우는 것이 좋겠지 만 포인터를 해당 공간으로 반환하는 경우에는 사용하면 안됩니다.

한편, 일 수있는 문자열 배열을 반환하는 것을 고려해 볼 수 있습니다.. 이를 위해서는 각 하위 문자열을 개별적으로 할당해야합니다 (이 경우 strdup()은 다시 친구가됩니다).이 경우 작업 공간을 확보하거나 VLA를 사용하는 경우 자동으로 정리할 수 있습니다.

0

두 당신이해야 할 일이 있습니다. 지금은 str ('\0'으로 끝나지 않음)을 strtok으로 전달하면 이 정의되지 않은 동작 인이됩니다.

그리고 두 번째 문제는, 당신은 또한 nystring의 각 포인터에 메모리를 할당하고 ( NUL 종료를위한 공간을 잊지 마세요 ) 대신 temp를 가리키는의 strcpy를 사용합니다.