【问题标题】:C/C++ read char* input of unknown length [duplicate]C / C ++读取未知长度的char *输入[重复]
【发布时间】:2017-03-18 07:22:03
【问题描述】:

我想知道是否可以读取未知大小的字符串,直到空格或到达换行符为止。我在 C++ 中所做的是:

char * dynStr;
char buffer[20];

cin >> buffer;
dynStr = new char[strlen(buffer) +1];
strcpy(dynStr, buffer);

但问题是,如果输入的输入大于 20 怎么办?所以我认为应该是这样的:

do
{
 cin.get ( buffer, 20, ' '); //im not sure this is the right approach
 strcpy(.....); // if is not  a first iteration 
 //add the new buffer to the  end of dyn str..
} while( ! read ' ' or '\n' ) <--- this is what I have problem doing

我知道在 c++ 中我可以使用 std::string ,但我想知道如何做这件事,所以如果你有任何想法,请告诉我:)

【问题讨论】:

  • 不仅可以在 C++ 中使用std::string,而且应该将它用于现代、“自然”的 C++。
  • 无论您尝试什么,不要尝试读取单个字符来组装字符串。因为:这两种删除键(以及为这个问题添加一些东西,如果行太长,控制台中的换行符),箭头键,以及许多其他问题。
  • @deviantfan 我不明白你的意思。如果我理解正确,OP 只是想在没有 std::string 的情况下重新实现 cin &gt;&gt; std::string
  • @deviantfan 您的评论是关于阅读字符,而不是检测按键。键不是字符。
  • @melpomene 是的,但是如果有人会阅读完整的评论......整个讨论没有任何意义。 ...这是一些人不喜欢某人不想使用 std::string 的问题之一,因此他们开始对每个不推荐 std::string 的人吹毛求疵...典型的 SO。

标签: c++


【解决方案1】:

get() 和其他几种方法,只能读取直到读取单个特定字符。您想阅读,直到收到换行符或空格。

对于这种简单的情况,最好简单地使用

cin.get();

一次读取一个字符,将其附加到您的字符串,检查每个字符是否有空格或换行符。根据您的具体情况,您可能还需要使用peek();

这可能不是很有效,但对于从流中读取的简单练习来说,这将是一个很好的起点。在你开始工作之后,你可以阅读read()方法的文档,并实现一个更复杂的算法来从流中读取和缓冲更大的文本块,然后手动搜索每个读取缓冲区的下一个空间或换行符,如果找到,则将剩余的文本保存在缓冲区中以供以后处理。

从一个简单的初始逻辑开始,一次读取一个字符,然后进入更复杂的方法。

【讨论】:

  • 听起来不错,你能告诉我用 cin.get() 读取输入的 1 by 1 字符是否比用 cin 读取整个单词慢 >>?
  • @user7091569 这是许多实现对cin&gt;&gt;s 所做的事情。参见例如sgi.com/tech/stl/string 搜索/查找operator&gt;&gt;
  • @user7091569:你为什么不直接测量一下? 能找到速度的不同吗?
猜你喜欢
  • 1970-01-01
  • 2016-03-11
  • 1970-01-01
  • 1970-01-01
  • 2015-06-08
  • 1970-01-01
  • 2019-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多