【问题标题】:Reading an input stream without extracting读取输入流而不提取
【发布时间】:2013-11-03 21:28:46
【问题描述】:

我正在尝试计算输入流中的字符数,直到第一个非数字,而不实际从流中提取字符。输入可以包含任意数量的字符。我需要这样做以确定在将数字存储在数组中的流中之前是否应该增长一个动态数组。

我仅限于以下库:iostream、cstring、cctype

我在想这样的事情:

int counter = 0;
const char * s = cin.getline();

while( s[counter] <= '0' || s[counter] >= '9' )
{
   counter++;
}

但我在让它工作时遇到了一些麻烦。任何建议将不胜感激!

【问题讨论】:

  • 我会根据需要增加动态数组!复制字符非常快,如果数组呈指数增长,整体复杂度仍然是线性的。
  • 这是有道理的。我不知道为什么我不只是这样做。出于某种原因,我在脑海中想到我必须在提取之前调整大小。我只是添加了一个简单的: if( maxSize == counter ){ Grow();并且它现在工作正常。谢谢!

标签: c++


【解决方案1】:

尝试类似:

std::istream::pos_type start = is.tellg();

while (std::isdigit((is >> std::ws).peek()) && is.ignore())
    ;

counter = in.tellg();
is.seekg(start, std::ios_base::beg);

在这种情况下,空格算作非数字字符吗?如果是这样,请从 while() 循环中删除第二行,该循环会丢弃前导空格。

【讨论】:

  • 如果你想寻找,你可能想回到序列的开头。为每个角色寻找未来也会非常昂贵!你最好使用sbumpc()
  • @DietmarKühl 不明白“回到起点”是什么意思?你可以解释吗?但我会接受你的其他建议! :)
  • 请求是确定将有多少字符来而不是消耗它们。您的代码确实会消耗它们!你需要std::istream::pos_type start(in.seekg(0, std::ios_base::cur)); ... ; in.seekg(start);
  • @DietmarKühl 好的,我明白你在说什么。 :D
猜你喜欢
  • 2016-11-24
  • 2023-04-04
  • 2012-08-16
  • 1970-01-01
  • 1970-01-01
  • 2018-01-08
  • 2022-01-11
  • 2014-12-04
相关资源
最近更新 更多