Помогите пожалуйста. Функция должна выводить слово(слова) минимальной длины. Я решил найти длину минимального слова, и если текущее слово в цикле имеет эту длину, то выводим его. Но при выводе в терминал выводится только одно слово
"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?
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Почему strcat в цикле добавляет содержимое второго массива (аргумента) в первый несколько раз, как показано на картинке
Есть ли какие-нибудь инструменты для C++ на Windows, которые позволяют узнать, сколько раз программа выполнила какую-то строчку?
Пытаюсь создать графический редактор на QtДобавил на сцену графические элементы QGraphicsItem на сцену QGraphicsScene
Как можно записать данные в файл Excel, сначала создав этот файл? Также можно ли это сделать с помощью функции ofstream?