как ввести массив слов Переполнение стека

Мне нужно написать программу, которая имеет в качестве входных данных массив слов, каждое слово не должно превышать 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 часа!

0

Решение

Для начала прочитайте в 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] << ' ';
}
}
}
2

Другие решения

Ты можешь использовать vector<string> хранить входы. Затем, используя std::string::find() найти подходящие.

0

По вопросам рекламы [email protected]