C/C++ 读取长度未知的 char* 输入

4

我想知道是否可能读取一个未知大小的字符串,直到空格或换行符被遇到。在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,但我想知道如何做到这一点,如果您有任何想法,请告诉我 :)


6
在现代的、符合"自然"的C++编程中,不仅可以使用std::string,而且应该使用它。 - crashmstr
@deviantfan 当我发布评论时,你的评论还没有加载出来。但问题在哪里?难道不能过滤掉不可打印字符吗? - HolyBlackCat
4
@deviantfan 我不明白你的意思。如果我理解正确,OP只是想重新实现cin >> std::string,但不使用std::string - HolyBlackCat
1
@deviantfan,你的评论是关于读取字符,而不是检测按键。按键不是字符。 - melpomene
2
@melpomene 对的,但如果有人读了完整的评论...这整个讨论就没有意义了。...这是一个问题,一些人不喜欢使用std::string,所以他们开始挑剔每个不推荐std::string的人...典型的SO。 - deviantfan
显示剩余10条评论
1个回答

2

get()和其他一些方法只能读取直到读到一个特定的字符为止。您希望读取直到收到换行符或空格。

对于这样简单的情况,最好直接使用

cin.get();

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

这可能不是非常高效的做法,但对于从流中读取数据的简单练习来说,这是一个良好的起点。在完成这项工作后,您可以阅读read()方法的文档,并实现更复杂的算法以读取和缓冲来自流的大块文本,然后手动搜索每个读取缓冲区以查找下一个空格或换行符,如果找到,则保存剩余的文本到缓冲区以便稍后处理。

从简单的逐个字符读取开始,然后逐步采用更复杂的方法。


听起来不错,你能告诉我用cin.get()逐个字符读取输入是否比用cin >>一次读取整个单词更慢吗? - Petar D.
@user7091569 这是许多实现针对 cin>>s 所做的操作。例如,请参阅 http://www.sgi.com/tech/stl/string,搜索/查找 operator>> - Captain Giraffe
@user7091569:为什么不直接测量一下呢?你能感受到速度上的差异吗? - Christian Hackl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接