c++ - 终止多行用户输入?

标签 c++ user-input vector

最近的项目有点问题。此处的目标是能够输入几行文本,其中包含 mm/dd/yyyy 格式的日期,后跟空格,然后是事件描述。我实际上已经实现了允许多行文本输入(我认为),但现在我不确定如何停止它。有没有一种方法可以简单地假设在一段时间后,用户可能已经完成输入?这个问题让我压力很大,因为他们从未真正解决过如何最终用户输入,只解决了如何完成多行。我们必须使用标准的用户输入,而不是来自文本文件,这样会容易得多。下面的代码,如果我在其他地方犯了一个未被注意到的错误,请随时告诉我。我只需要能够让用户完成输入,这样程序就可以重新排序 events[] 并输出它们。

日历.cpp

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

using namespace std;
#include "event.h"


int main(){
 // Maximum number of input lines
 const int MAX = 100; 

 // Array of pointers to events 
 Event *events[MAX];

 // Number of currently used pointers in events
 int size = 0;
 int i = 0;

 // Vector containing each input line as a string
 vector<string> vec (100);
 char temps[100];
 while(i < MAX){
  cin.getline(temps, 100);
  vec[i] = temps; 
  i++;
 }


 for(int i = 0; i < vec.size(); i ++){
   int found = vec[i].find("/");
   int tmo = atoi(vec[i].substr(0, found).c_str());
   int sfound = vec[i].find("/", found + 1, 6);
   int tda = atoi(vec[i].substr(found + 1, sfound - (found + 1)).c_str());
   int tye = atoi(vec[i].substr(sfound + 1, 4).c_str());
   string tdes = vec[i].substr(sfound + 6, vec[i].length() - (sfound + 6));
   events[size] = new Event(tmo, tda, tye, tdes);
   size++;
 }

 return 0;
}

事件.cpp

#include <iostream>
#include <string>

using namespace std;
#include "event.h"

Event::Event(int mo, int da, int ye, string des){
 month = mo;
 day = da;
 year = ye;
 desc = des;
}

Event::~Event(){

}

void Event::print(){
 cout << month << "/" << day << "/" << year << " " << desc << endl;
}

事件.h

#ifndef EVENT_H
#define EVENT_H

#include <iostream>
#include <string>
using namespace std;

class Event{
 public:
  Event(int mo, int da, int ye, string des);
  ~Event();
  void print();
 private:
  int month;
  int day;
  int year;
  string desc;
};

#endif

预先感谢您的帮助。

编辑:

将我的 while() 循环替换为:

while ((i < MAX) && (!cin.eof()) {
  cin.getline(temps, 100);
  vec[i] = temps; 
  i++;
 }

看起来很有希望,但即使按照建议使用 Ctrl + D (^D) 注入(inject) EOF 标记后,用户输入仍然可以继续。这可能发生的任何原因?

最佳答案

完成此操作的一种方法是让用户按 Ctrl-D 以表示文件结束。您将必须检查循环中的文件结尾。

while ((i < MAX) && (!cin.eof()) {
  cin.getline(temps, 100);
  vec[i] = temps; 
  i++;
 }

此方法还有一个额外的好处,即可以将文本文件呈现给程序而不是用户输入,并且当到达文件末尾时将获得相同的结果。

编辑:

Ctrl-Z 是 Windows 机器上的 EOF 击键。 Ctrl-Z 可能必须位于该操作系统上一行的开头(有关此主题的更多信息,请参阅 http://www.velocityreviews.com/forums/t356170-cant-detect-eof-from-stdin-on-windows-console.html 中的讨论)

关于c++ - 终止多行用户输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3784812/

相关文章:

django - 根据用户输入使用 django-celery 调度任务

python - 在服务器上安全地执行用户提交的 python 代码

c++ - 在 eclipse 4.16.0 中启用 pretty-print 在 Windows 10 上不起作用

c++ - 结合 std::string 和 std::vector<char>

c++ - 如何增加 QNetworkReply::downloadProgress 信号频率?

c++ - 在 llvm/clang 中不按设计使用 C++ 异常

c++ - std::valarray 的 future 会是什么样子?

java - 如何根据用户输入使这些循环继续?在java eclipse中

c++ - 中值函数 C++ 的问题

c++ - Visual C++ 2017(版本 15.9.3)中出现错误