코드에 여러 가지 문제가 있습니다. 그 중 :
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를 사용하는 경우 자동으로 정리할 수 있습니다.
프로그램에서 어느 시점에서 생각하고있는 것을하지 못하고 있습니까? – RPGillespie
이 문맥에서 "효과가 없다"는 것을 알려주세요. 당신은 어떤 결과물을 얻고 있습니까? –
박쥐를 똑바로 뽑아 보면, 이것은 매우 의심스러워 보입니다 :'char ** nystreng = malloc (strlen (s));'. 필요한 공간이's'의 길이와 같고'char * '의 크기와 독립적 인 이유는 분명하지 않습니다. –