Для начала прочитайте std::string
, так что вам не нужно беспокоиться о длине. Вы делаете это условие цикла, так что вы прочитали и сразу же проверить это удалось:
std::string word;
while (std::cin >> word) // ...
Это читает строки, разделенные пробелами (пробелы, табуляции, новой строки, и т.д.). я затем хранить их в std::vector
, так что вам не придется беспокоиться, как много слов есть:
std::vector<std::string> words;
std::string word;
while (std::cin >> word)
words.push_back(word);
Чтобы затем цикл над этим и напечатать слова, начинающиеся с "stu"
, у вас есть различные варианты. Я собираюсь предложить использовать алгоритм стандартной библиотеки copy_if
. Для этого требуется предикат (функция проверки) и применяет его к каждому элементу в vector
. Если предикат возвращается true
, копирует элемент в другое место, в этом случае (и это только немного неудобный бит), мы копируем в std::cout
, используя специальный вид итератора называется ostream_iterator
:
std::copy_if(std::begin(words),
std::end (words),
std::ostream_iterator<std::string>(std::cout, " "),
[](const std::string& word){ return word.find("stu") == 0; });
Используется несколько функций C++11
(copy_if
, lambdas, non-member begin
/end
). Вы также можете написать голый цикл самостоятельно (предпочитает не):
for (std::vector<std::string>::const_iterator it = words.begin();
it != words.end();
++it)
{
if (it->find("stu") == 0)
std::cout << *it << ' ';
}
Вы можете использовать аналогичные методы для чтения ввода, но я показал более общий путь (в моем опыте) выше. Некоторые утверждают, что это предпочтительнее, но он использует более нечетные итераторы:
std::vector<std::string> words;
std::copy(std::istream_iterator<std::string>(std::cin),
std::istream_iterator<std::string>(),
std::back_inserter(words));
istream_iterator
является способом лечения входного потока, как контейнер.
Так что дает вам два варианта:
написать сырой Loops себя: while
и for
. Вот как это большинство людей пишут, особенно «новички», но я обычно предпочитаю использовать встроенные функции, чтобы избежать низкого уровня. Подумайте с точки зрения концепции, которую вы применяете, то есть «Я копия Эти слова на экран, , если они начинаются с« stu ».
Другой вариант - использовать средства, предусмотренные в заголовке <algorithm>
. Мне нравится этот вариант, но это связано с тем, что вы обдумываете некоторые нечетные итераторы.
Edit: Кстати, заголовки вам нужно будет это <algorithm>
, <iostream>
, <iterator>
, <string>
и <vector>
. (Вы можете удалить <algorithm>
и <iterator>
, если вы напишете необработанные петли).
Редактировать снова: Хорошо, я ненавижу себя за это, но вот способ сделать это с помощью только C
-строчных строк. Вы должны быть ОЧЕНЬ осторожны при работе с обнаженными массивами и указателями. Я прокомментировал код, чтобы объяснить каждый шаг. Я предпочитаю не просто дать полное решение, как это, но я не уверен, как лучше всего объяснить каждую часть в противном случае. Пожалуйста, учитесь у него, а не просто краду его.
#include <cstring>
#include <iostream>
typedef char FixedLengthString [51]; // 50 chars plus NUL-terminator
int main()
{
FixedLengthString words [10]; // assume you never have more than 10
// if you have no limit, this is harder
// need to do two things at once in the loop:
// - read no more than ten
// - read and check it succeeded
int read = 0; // outside the loop, as we need it later
for (; read < 10; ++read)
{
std::cin.width(50); // saves us from overflowing by reading too much
std::cin >> words[read];
// die if the read failed (end of input or something broke)
if (!std::cin) break;
}
// loop over however many we successfully read
for (int i = 0; i < read; ++i)
{
// compare the first 3 characters of the words with "stu"
if (std::strncmp("stu", words[i], 3)==0)
{
std::cout << words[i] << ' ';
}
}
}
Это необходимое ограничение для использования массивов вместо std :: vector? и char * вместо std :: string? – Constantin
Вы действительно не хотите 'str1 = 'watch'; str2 = 'stumble'; '- это почти никогда не бывает хорошей идеей. Поместите их в массив или какую-либо другую структуру данных списка. – slim