C++ Программа по подсчёту кол-ва символов/букв у последнего слова (или набора символов)

я начинающий программист и у меня возникла проблема при решении задачи. Задача заключается в том, чтобы написать программу, которая подсчитывала бы кол-во символов или букв у последнего слова или группы символов. Символы/слова вводятся при запросе программы, все слова или группы символов разделены между собой пробелом. Заранее благодарю за помощь. P.S. "Даны натуральное число n, символы s1, …, sn. Группы символов, разделенные пробелами (одним или несколькими) и не содержащими пробелов внутри себя, будем называть словами. Подсчитать количество букв в последнем слове данной последовательности".


Ответы (1 шт):

Автор решения: Zombotron

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

  • создаете счетчик k = 0;
  • перебираете в цикле строку с конца до начала
  • в цикле проверяете символ, если он == " ", то выходите из цикла, если нет, то k++;
  • по окончанию цикла в переменной k будет кол-во знаков последней группы символов.

Интуитивно же хочется с начала проверять. Тоже можно:

  • создаете счетчик k = 0;
  • перебираете в цикле строку с начала до конца
  • в цикле проверяете символ, если он == " ", то k = 0;, если нет, то k++;
  • по окончанию цикла в переменной k будет кол-во знаков последней группы символов.

В высокоуровневых языках такое делают немного по-другому:

  • разбивают строку по разделителю " " (пробел), получают списковую структуру (массив, словарь, ...)
  • берут последний элемент, полученной структуры
  • получают кол-во симв. в нем.

Так же во многих ЯП есть строковые ф-ции для выборки сразу подстроки по условиям.

Вот навскидку нагуглилось по запросу "c++ substring find last" (первая ссыль в выдаче)

#include <iostream>       // std::cout
#include <string>         // std::string
#include <cstddef>         // std::size_t

void SplitFilename (const std::string& str)
{
  std::cout << "Splitting: " << str << '\n';
  std::size_t found = str.find_last_of("/\\");
  std::cout << " path: " << str.substr(0,found) << '\n';
  std::cout << " file: " << str.substr(found+1) << '\n';
}

int main ()
{
  std::string str1 ("/usr/bin/man");
  std::string str2 ("c:\\windows\\winhelp.exe");

  SplitFilename (str1);
  SplitFilename (str2);

  return 0;
}

https://onlinegdb.com/S8hQ__X8N

Тут разделитель \ или /; выводится то, что до последнего разделителя и что после.

upd: Да, еще нужно проверить или в начале и в конце нима разделителя...

→ Ссылка