Помогите пожалуйста. Функция должна выводить слово(слова) минимальной длины. Я решил найти длину минимального слова, и если текущее слово в цикле имеет эту длину, то выводим его. Но при выводе в терминал выводится только одно слово
"Hello wo rl dddd" ---> "wo"
Код функции:
void findSmallestWord(char* text){
int length = strlen(text);
int minLength = minWordLength(text, length);
char minWords[minLength];
int index = 0;
int symbols = 0;
int j = 0;
for(int i = 0; i < length; i++){
if((text[i] >= 'A' && text[i] <= 'Z') || (text[i] >= 'a' && text[i] <= 'z')){
symbols++;
}
else{
if(symbols == minLength){
index = i - symbols;
while(j < symbols){
minWords[j] = text[index];
index++;
j++;
}
minWords[j] = ' ';
symbols = 0;
}
else{
symbols = 0;
}
}
}
for(int i = 0; i < j; i++){
cout << minWords[i];
}
cout << endl;
}
Вот здесь char minWords[minLength]; так и просится char minWords[minLength+1]; - вы точно не забыли о завершающем нулевом символе? И это - если только для одного слова... Но все равно это некомпилируемая ерунда, потому что в C++ размер массива надо знать во время компиляции.
Проверка (text[i] >= 'A' && text[i] <= 'Z') || (text[i] >= 'a' && text[i] <= 'z') сводится к одному isalpha(text[i]).
Ваш главный прокол - в проверке while(j < symbols) - после первого слова j перестает быть меньше symbols. И на следующем найденном слове копирование не выполняется. Там вообще нужно подчистить эту логику, после пробела нужно увеличить j.
А вообще, раз это C++, я бы делал примерно так:
vector<string> minLengthWords(const char * text)
{
vector<string> words;
istringstream is(text);
string word;
size_t minlen = numeric_limits<size_t>::max();
while(is >> word)
{
size_t l = word.length();
if (l < minlen) minlen = l;
words.push_back(word);
}
words.erase(remove_if(words.begin(),words.end(),
[minlen](const string&w){ return w.length() > minlen; }),
words.end());
return words;
}
int main()
{
const char * text = "vvjhvx xjhvxz agsvghvds hdbhj gsvg csfc casgfcgfas vsac";
for(auto s: minLengthWords(text)) cout << s << endl;
}
Вот немного исправленный ваш код.
void findSmallestWord(const char* text)
{
int length = strlen(text);
int minLength = minWordLength(text, length);
char * minWords = new char[length+1]; // Если для C - то char * minWords = malloc(length+1);
int index = 0;
int symbols = 0;
int j = 0, lastpos = 0;
for(int i = 0; i < length; i++)
{
if(isalpha(text[i]))
{
symbols++;
}
else
{
if(symbols == minLength){
index = i - symbols;
while(j < symbols)
{
minWords[lastpos + j++] = text[index++];
}
minWords[lastpos + j++] = ' ';
lastpos += j;
j = 0;
}
symbols = 0;
}
}
minWords[lastpos] = 0;
cout << minWords << endl; // В С используйте puts(minWords);
delete[] minWords; // В С используйте free(minWords);
}
Но учтите, он не сработает, если последнее слово в строке - минимальной длины. Но этот случай уж разберите самостоятельно, OK?
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости