Во-первых, как сказал @MM, когда вы хотите продолжить токенизацию той же строки, вы должны вызвать strk(NULL, "..")
, а не с '\0'
.
Во-вторых, логика вашей программы не имеет большого смысла,Вы разбиваете строку s
на подстроки, но никогда не объединяете их в new_s
. К тому времени, когда вы перейдете ко второму времени, tokenptr
, несомненно, будет NULL
, поэтому вы никогда не войдете в цикл.
Чтобы исправить ваш код, я объединил два while в один и добавил оператор if кне вызывайте strcat(new_s, tokenptr)
, если tokenptr
равен NULL.
void removePuncNspace(char s[])
{
char new_s[50], *tokenptr;
//convert from uppercase to lowercase
for (int i = 0; i < strlen(s); i++) (char)tolower(s[i]);
//use a cstring function and tokenize s into token pointer and eliminate spaces and punctuation marks
tokenptr = strtok(s, " ,.?!:;");
//concatenate the first token into a c-string.
strcpy(new_s,tokenptr);
while (tokenptr != NULL)
{
tokenptr = strtok(nullptr, " ,.?!:;"); //tokenize rest of the string
if (tokenptr != NULL)
strcat(new_s, tokenptr);
}
//copy back into the original c - string for the pass by reference.
strcpy(s, new_s);
}
PS: я использовал небезопасные версии функций cstring, потому что по какой-то причине мой компилятор не любит безопасные.