2013-08-22 2 views
-5

пример того, что я пытаюсь сделать:получить первую букву каждого слова в строке с помощью C++

String = "This Is My Sentence" 

Я ищу, чтобы получить это в результате: «TIMS», который принимает только первую букву каждого слова.

Я борюсь с C++.

+0

Dont видит C++ кода. – MarsOne

+0

http://stackoverflow.com/a/237280/1056003 Этот ответ делает большую часть работы для вас уже – nijansen

+0

Сам вопрос не так уж плох. Если бы вы только потрудились опубликовать некоторые из ваших кодов, у вас были бы upvotes – MarsOne

ответ

0
cout<<myString[0]; 
for(int i=0;i<(myString.size-1);i++) 
     { if(myString[i]==" ") 
      { 
      cout<< myString[i+1]; 
      { 
     } 

Я не проверял, собирается ли он таким образом, но вы можете получить представление об этом возможном простом решении. Он будет работать только со строками, подобными вашему примеру. Вы должны взглянуть на метод Split, как и другие, которые уже предложены.

+0

Мне не нужно проверять ваше решение, чтобы сообщить вам, что он не будет работать. Извините за зверское честность – MarsOne

+0

Не могли бы вы рассказать мне, где моя идея неправильная? Только проблема Я вижу, если строка имеет несколько пробелов в строке, но она должна работать в данном примере. –

+0

Это не будет работать для первой буквы. Не нужно объяснять дальше. – MarsOne

0

Попробуйте использовать std::string и его функцию find.

0

Разделите его пробелами на массив, используйте цикл for, чтобы получить каждое слово и добавьте первую букву в строку.

Split

For loop

В цикле, чтобы получить значение кулак просто сделать "string_word [0]"

0

Посмотрите Boost Tokenizer - код должен выглядеть как-то так (не тестировалось):

std::string firstLetters(const std::string& str) 
{ 
    std::string result=""; 
    typedef boost::tokenizer<boost::char_separator<char> > tokenizer; 
    boost::char_separator<char> sep(" "); 
    tokenizer tokens(str, sep); 

    for (tokenizer::iterator tok_iter = tokens.begin(); 
     tok_iter != tokens.end(); ++tok_iter) 
      { 
       if (tok_iter->size>0) 
       { 
        result+=(*tok_iter)[0]; 
       } 
      } 
    return result; 
} 

В качестве альтернативы, вы можете также использовать Boost String Algorithms (опять непроверенные)

std::string firstLetters(std::string& str) 
{ 
    std::string result=""; 
    std::vector<std::string> splitvec; 
    boost::split(splitvec, str, boost::is_any_of(" "), boost::token_compress_on); 

    //C++11: for (std::string &s : splitvec) 
    BOOST_FOREACH(std::string &s, splitvec) 
    { 
     if (s.size()>0) 
     { 
      result+=s[0]; 
     } 
    } 
    return result; 
} 

Для полноты следует упомянуть функцию strtok, но это больше, чем C C++ ;-)

* Jost

+0

Мне нравится Boost, на самом деле. Но в этом случае я бы назвал overkill – nijansen

+0

@nijansen только немного, -) ... Да, вы правы, но представьте себе, что в следующий раз потребуется решение для нескольких разделителей, и я не хочу видеть вызов функция 'find' для каждого разделителя (также думайте о нескольких символах пробела). Это просто более мощный подход - вот почему я разместил его. – Jost