2013-12-06 2 views
0

Мне нужно написать программу, которая имеет в качестве входных данных массив слов, каждое слово составляет 50 символов или меньше. (Я могу использовать только <iostream> и <string.h>)как ввести массив слов C++

Входной образец: часы точка спотыкаются студент Добро пожаловать

мой код:

char input[1000000]; 
for (int i = 0, i < 1000000, i++) { 
    cin >> input[i]; 
} 

Теперь, как я могу определить каждое слово (не более 50 символов в слово) и сохранить его в отдельной строке, чтобы:

str1 = 'watch' 
str2 = 'stumble' 

и так далее.

Тогда я должен найти все слова, которые начинаются с префикса, который пользователь вводит, например , если префикс «сту» выход: спотыкаются студент

Я был бы очень признателен, если кто-нибудь может помочь в ближайшие 1-2 часа!

+0

Это необходимое ограничение для использования массивов вместо std :: vector? и char * вместо std :: string? – Constantin

+0

Вы действительно не хотите 'str1 = 'watch'; str2 = 'stumble'; '- это почти никогда не бывает хорошей идеей. Поместите их в массив или какую-либо другую структуру данных списка. – slim

ответ

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, 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] << ' '; 
     } 
    } 
} 
+0

к сожалению я могу использовать только и мои знания в C++ действительно ограничены прямо сейчас, и мне нужно написать программу на самом нижнем уровне: D Спасибо вам за долго и описательный ответ! – user3073408

+0

@ user3073408 Хорошо, я постараюсь предоставить более подробную информацию, чтобы помочь вам придумать ответ в ваших ограничениях. Во-первых, позвольте мне проверить. Это заголовок '', или ''? Это действительно имеет значение, они очень разные (и вы никогда не должны использовать второй в C + +, поэтому я спрашиваю, но давайте не будем вдаваться в это прямо сейчас). – BoBTFish

+0

@ user3073408 Кроме того, существует ли ограничение на количество слов? – BoBTFish

0

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

+0

Я новичок в C++, поэтому я не знаю, как использовать эти функции:/ Есть ли решение, использующее более простой язык? – user3073408

+0

@ user3073408: Я предлагаю вам сначала прочитать некоторые книги, взгляните на [The Definitive C++ Book Guide and List] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and- список) – David

+0

сделаю, спасибо за ответ :) – user3073408

Смежные вопросы