Поиск среднего слова в строке

#c

#c

Вопрос:

Как следует из названия, у меня возникли проблемы при попытке извлечь среднее слово из строки, я считаю, что моя формула неверна, но я не совсем уверен, что отсюда можно исправить проблему, любая помощь всегда приветствуется спасибо!

 #include <iostream>
#include <algorithm>

using namespace std;

int main()
{
     string sentence="";
     string middle="";
     string midtemp="";
     int count=0;
     int mid=0;

     cout << "Enter a sentence:" << endl;
    getline(cin,sentence); //gets user input

   
  for(int count =0; count<sentence.length();count  ){
       letter=sentence.substr(count,1);

        int mid = sentence.length();
        if (midtemp.length()>middle.length())
           { midtemp=middle;}
         if (sentence[count]!=' ')
           { if(mid%2==0);
           reverse(longest.rbegin(),longest.rend()); //shows the word not backwards
           cout<<"Middle word is: " << sentence.substr(mid/2 -1) <<"n" << endl;
           break; //presents info to user
           }
        else(mid%2!=0);
        { mid/2;
             cout<<"Middle word is: " << sentence.substr(mid/2 -1) <<"n" << endl;
           break; //presents info to user if number is even
        }
       }
  

Комментарии:

1. пожалуйста, укажите ввод, вывод и ожидаемый результат в вопросе. Что такое среднее слово в строке? Например, что такое среднее слово в "Hello World" ?

2. Я не верю, что код работает, это не неправильная формула, это просто неверно понятый алгоритм (а также ряд ошибок в кодировании). Способ решить сложную проблему — разбить ее на части. Итак, попробуйте это, шаг 1 разбейте предложение на слова. После первого шага у вас будет вектор строк, каждая строка — одно слово. Шаг 2 выберите среднюю запись из вектора. Теперь у вас есть две проблемы вместо одной, но каждая проблема проще, чем исходная проблема.

3. Да, извините за этот плохой пост, я отказался от этого кода и перезапускаю, спасибо за помощь!

Ответ №1:

Чтобы найти среднее слово в строке из трех слов, используйте:

 size_t begin_index = sentence.find(' ')   1;
size_t end_index = sentence.find(' ', begin_index);
size_t length = end_index - begin_index;
string middle_word = sentence.substr(begin_index, length);
  

Чтобы найти среднее слово в строке с любым нечетным числом слов, используйте:

 // create string stream from sentence
istringstream ss(sentence);
// split string stream into vector of words
vector<string> words(istream_iterator<string>(ss), {});
// get middle index
size_t middle_index = (words.size() - 1) / 2;
// get middle word
const autoamp; middle_word = words[middle_index];
  

Если имеется четное количество слов, результат округляется либо в большую, либо в меньшую сторону до C 11, после C 11 он округляется в меньшую сторону. (К слову перед средним пробелом).

Комментарии:

1. Ничто в постановке задачи не говорит, что должно быть три слова. Вы, конечно, можете быть правы, и OP пропустил эту важную деталь.

2. Вы правы, есть среднее слово, если есть 5 слов, и я никогда не думал об этом, позвольте мне переосмыслить

3. » результат округляется либо в большую, либо в меньшую сторону до C 11 «. Действительно? Что изменилось в C 11? Я думаю, оно всегда должно быть округлено в меньшую сторону.

4. «Двоичный оператор / делит первый операнд на второй (после обычных арифметических преобразований). Для целых операндов это дает алгебраическое частное. Частное округляется в направлении, определенном реализацией. (до C 11). Частное усекается до нуля (дробная часть отбрасывается). (начиная с C 11)`.» — en.cppreference.com/w/cpp/language/operator_arithmetic

Ответ №2:

 #include <iostream>
#include <string>
#include <vector>

using namespace std;

int main(int argc, char **argv) {
  string input;
  getline(cin, input);

  vector<string> tokens;

  string token;
  for (size_t i = 0; i < input.length(); i  ) {
    char c = input[i];
    if (c == ' ' || !input[i   1]) {
      if (!input[i   1])
        token  = c;
      tokens.push_back(token);
      token = "";
      continue;
    }
    token  = c;
  }

  auto mid = tokens.size() % 2 == 0 ? tokens.begin()   tokens.size() / 2 - 1
                                    : tokens.begin()   tokens.size() / 2;
  cout << *mid;

  return 0;
}