Как уже упоминалось в комментарии, у вас есть UB, поскольку вы возвращаете указатель на локальную переменную (words
). Первоначально у вас также было n++
в вашем l oop вместо (n*)++
, который также является UB. Вам нужна проверка ошибок в вашем коде, но следующее работает, и все еще остается с char*
(без проверки ошибок):
#include <string>
#include <iostream>
char *setWord( char string[], int *n ) {
char word[20] = { 0 };
string += *n;
while ( *string == ',' || *string == '\t' || *string == '\n' || *string == ' ' || *string == '.' || *string == '!' || *string == '?' ) {
string++;
( *n )++;
}
int i = 0;
while ( *string != ',' && *string != '\t' && *string != '\n' && *string != ' ' && *string != '.' && *string != '!' && *string != '?' ) {
word[i++] += *string;
string++;
( *n )++;
}
std::cout << word;
char *words = new char[i + 1];
strncpy( words, word, I + 1 );
return words;
}
int main() {
char str[] = "hello world!";
int n = 5;
char *word = setWord( str, &n );
delete[] word;
return 0;
}
Используя std::string
, вы можете сделать (без проверки ошибок):
std::string setWord( std::string string, int *n ) { // copy on purpose
int start = *n;
*n = string.length();
size_t end = string.find_last_of( ",\t\n .!?" );
string = string.substr( string.find_first_not_of( ",\t\n .!?", start ) );
if ( end != std::string::npos ) {
string = string.substr( 0, string.find_last_of( ",\t\n .!?" ) ); // because it's not end
*n = (int)end;
}
std::cout << string;
return string;
}