Есть ли способ заставить C ++ принимать неопределенное количество строк из cin? - PullRequest
0 голосов
/ 22 октября 2019

Я пытаюсь разрешить пользователю ввести приличное количество слов (около 10-20), а затем проанализировать ввод, но с помощью приведенного ниже кода будет ждать, пока пользователь введет значение для каждые string.

Есть ли способ заставить C ++ автоматически заполнять оставшиеся строки нулевым символом или чем-то подобным, чтобы ввод числа слов меньше максимального не вызвал задержку?

Код:

#include <iostream>
#include <string>

int main()
{
  std::string test1;
  std::string test2;
  std::string test3;
  std::cout << "Enter values\n:";
  std::cin >> test1 >> test2 >> test3;
  std::cout << "test1: " << test1 << " test2: " << test2 << " test3: " << test3 << std::endl;
}

Ответы [ 3 ]

2 голосов
/ 22 октября 2019

Чтобы прочитать (и сохранить) и неизвестное количество пробельных строк, вам необходимо хранилище для каждой строки. Самый простой способ предоставить хранилище гибким способом, который можно добавлять в неограниченном количестве (вплоть до предела используемой памяти), заключается в векторе строк . Строка обеспечивает хранение каждой строки, а векторный контейнер обеспечивает простой способ собрать любое количество строк вместе.

Ваш вектор строк (vs) может быть объявлен как:

#include <iostream>
#include <string>
#include <vector>
...
    std::vector<std::string>vs {};

std :: vector предоставляет функцию-член .push_back() для добавления элемента (в данном случае string) в вектор, например

    std::vector<std::string>vs {};
    std::string s;

    while (std::cin >> s)
        vs.push_back(s);

, который просточитает строку s до тех пор, пока не встретится EOF, и каждая прочитанная строка будет добавлена ​​к вектору строк, используя vs.push_back(s);.

Если поместить его в целом, вы можете сделать:

#include <iostream>
#include <string>
#include <vector>

int main (void) {

    std::vector<std::string>vs {};
    std::string s;

    while (std::cin >> s)  /* read each string into s */
        vs.push_back(s);   /* add s to vector of strings */

    for (auto& w : vs)     /* output each word using range-based loop */
        std::cout << w << "\n";

}

Пример использования / вывода

$ echo "my dog has fleas" | ./bin/readcintostrings
my
dog
has
fleas

Посмотрите вещи и дайте мне знать, если у вас есть дополнительные вопросы.

1 голос
/ 22 октября 2019

Вы можете использовать цикл while. Что-то вроде этого

string s;
while (cin >> s) {
    cout << s << endl;
}

или взять вектор строк и сделать некоторое время, ввести входные данные в цикл while и вставить их в вектор.

как видите, он не хранится. если вы хотите хранить. делать

vector<string>text;
while(cin>>s){
   text.push_back(s);}
0 голосов
/ 22 октября 2019

Я понял это с помощью этого кода:

#include <iostream>
#include <string>

int main()
{
  std::string testTemp;
  std::string brokenUp[20];
  int lastOne = 0;

  std::cout << "Enter values\n:";
  std::getline(std::cin, testTemp);

  for(int current = 0; !testTemp.empty() && testTemp.find(' ') != -1; current++)
  {
    brokenUp[current] = testTemp.substr(0, testTemp.find(' '));
    testTemp.erase(0, testTemp.find(' ') + 1);
    lastOne = current;
  }
  lastOne++;
  brokenUp[lastOne] = testTemp;

  //this next part is just a test
  for(int i = 0; i <= lastOne; i++)
  {
    std::cout << brokenUp[i] << std::endl;
  }
}

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

...