Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.11.2014, 23:23   #1
alina1995
Пользователь
 
Регистрация: 13.11.2014
Сообщений: 15
По умолчанию Проблема со Строками

Доброго Времени Суток!
Не могу решить задачу со строками,возможно кто нибудь сможет помочь,вдруг у кого нибудь осталась задача..
Заранее большое спасибо.
Задача: . Вводится строка произвольного текста. Вывести на экран предпоследнее и последнее слово (слова разделены пробелами).
alina1995 вне форума Ответить с цитированием
Старый 14.11.2014, 00:37   #2
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

Вот так можно получить строку от пользователя и вывести её на экран:

Код:
#include <iostream>     // std::cout
#include <string>       // std::string

int main( )
{
    std::string str;

    // Получаем строку от пользователя
    std::cout << "Enter a text:\n> ";
    std::getline( std::cin, str );

    // Показываем введённую строку пользователю
    std::cout << str << "\n\n";

    return 0;
}
Можно поместить все слова в контейнер и вывести под нужным индексом:

Код:
#include <iostream>     // std::cout
#include <string>       // std::string
#include <vector>       // std::vector
#include <sstream>      // std::stringstream

int main( )
{
    // Входная строка
    std::string str = "Hello my computer!";

    // Помещаем слова в контейнер
    std::vector<std::string> vec;
    std::string word;
    std::stringstream ss( str );
    while( ss >> word ) {
        vec.push_back( word );
    }

    // Показываем пользователю последнее слово
    std::cout << "\nThe last word is \"" << vec[2] << "\"\n\n";

    return 0;
}
Здесь мы загоняем текст в объект std::stringstream и в цикле извлекаем по-одному слову, пока извлекается и добавляем это слово в контейнер:
Код:
    std::stringstream ss( str );
    while( ss >> word ) {
        vec.push_back( word );
    }
Последнее слово будет "computer!". Нужно ли показать, как убрать восклицательный знак и другие символы - не буквы?

Последний раз редактировалось 8Observer8; 14.11.2014 в 00:39.
8Observer8 вне форума Ответить с цитированием
Старый 14.11.2014, 01:01   #3
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

http://rextester.com/ZROV64019



Код:
#include <chrono>
#include <random>


//запчасти от стандартного генератора псевдослучайных чисел
namespace _private{

::std::default_random_engine& _RND()
{
    static ::std::default_random_engine r(
        static_cast<uint32_t>(
            ::std::chrono::system_clock::now().time_since_epoch().count()
        )
    );
    return r;
}
uint32_t RND() { return _RND()(); }
    
} //namespace _private

//------------------------------------------------------------
//генератор псевдослучайных чисел
//используется для рандомного создания строки с произвольными словами
uint32_t Random(uint32_t minvalue, uint32_t maxvalue)
{
    if(minvalue>maxvalue) 
    {
        const auto tmp = minvalue;
        minvalue = maxvalue;
        maxvalue = tmp;
    }
    return _private::RND() % (maxvalue - minvalue + 1) + minvalue;
}

//------------------------------------------------------------

#include <algorithm>
#include <iostream>
#include <sstream>
#include <string>
#include <stack>



using namespace std;

typedef ::std::string::value_type
            Ch;

//генерирует случайную строку наполненную произвольными словами
::std::string MakeRandomText(const size_t len = 30, const size_t spaces = Random(3,10) )
{
    ::std::string result(len, ' ');
    const auto lambda = [](){ return static_cast<Ch>(Random('a','z')); };
    ::std::generate_n(result.begin(), result.size(), lambda);
    
    for(size_t n=0; n<spaces; ++n)
        result[ Random(0, len) ]=' ';

    return result;
}
//------------------------------------------------------------

int main()
{
    std::cout << "Hello, world!\n";
    
    // получаем строку с произвольными словами
    const auto text = MakeRandomText();
    cout <<"text = '" << text << "'\n";
    
    
    
    // теперь отматываем два слова с конца строки
    ::std::stack<::std::string> st;
    
    const auto rewind_space = [](const Ch ch){ return ch==' '; };
    const auto rewind_word  = [](const Ch ch){ return ch!=' '; };
    
    auto end = text.rbegin();
    auto beg = text.rbegin();
    
    for(size_t n=0;n<2;++n)
        beg = ::std::find_if_not(end, text.rend(), rewind_space),
        end = ::std::find_if_not(beg, text.rend(), rewind_word),
        st.emplace( end.base(), beg.base() );
    
    
    // теперь показываем результат
    cout<<"---------------\n";
    while(!st.empty())
        cout<< st.top() <<endl,
        st.pop();

}
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема со строками tmpUserName Паскаль, Turbo Pascal, PascalABC.NET 0 13.05.2014 23:19
проблема со строками llatpoh Паскаль, Turbo Pascal, PascalABC.NET 2 01.11.2011 17:20
Проблема со строками :( coNsept Общие вопросы C/C++ 2 20.01.2010 00:31