Мне нужно написать программу, которая имеет в качестве входных данных массив слов, каждое слово не должно превышать 50 символов. (Я могу использовать только <iostream>
а также <string.h>
)
Пример ввода:
смотреть спотыкаться студент приветствуем
мой код:
char input[1000000];
for (int i = 0, i < 1000000, i++) {
cin >> input[i];
}
Теперь, как я могу определить каждое слово (максимум 50 букв на слово) и сохранить его в отдельной строке, чтобы:
str1 = 'watch'
str2 = 'stumble'
и так далее.
Затем я должен найти все слова, которые начинаются с префикса, который вводит пользователь, например
если префикс «stu», то вывод:
спотыкаться студент
Буду очень признателен, если кто-нибудь сможет помочь в ближайшие 1-2 часа!
Для начала прочитайте в 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
, лямбды, не являющиеся членами 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
способ обработки входного потока как контейнера
Так что это дает вам два варианта:
напишите сырые циклы самостоятельно: while
а также for
, Именно так пишут большинство людей, особенно «новички», но я обычно предпочитаю использовать встроенные функции, чтобы избежать низкоуровневых вещей. Думайте с точки зрения концепции, которую вы применяете, то есть «Я копия выводя эти слова на экран, если они начинаются с «сту» «.
Другой вариант заключается в использовании средств, предусмотренных в <algorithm>
заголовок. Мне нравится эта опция, но она включает в себя изучение некоторых странных итераторов.
Редактировать: Кстати, заголовки, которые вам понадобятся <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] << ' ';
}
}
}
Ты можешь использовать vector<string>
хранить входы. Затем, используя std::string::find()
найти подходящие.