gpt4 book ai didi

c++ - unget有任何保证吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:31:58 25 4
gpt4 key购买 nike

考虑以下因素:

char c;
cin >> c;
cin.unget();

假设char输入成功,unget是否保证至少能备份那个字符?如果我请求并成功获取到一个字符串,是否可以保证允许我一直调用 unget 直到该字符串的开头?

最佳答案

保证您能够unget至少 1 个字符。是否超过一个取决于实现和情况,所以你不应该假设你可以 unget不止一个。

编辑:抱歉,我在想 libc 的 int unget(int ch, FILE *stream) .标准说:

One character of pushback is guaranteed. If the ungetc function is called too many times on the same stream without an intervening read or file positioning operation on that stream, the operation may fail.

我会看看是否能准确找到关于 basic_istream<>& unget() 的内容

编辑: 好的,这就是 c++ 标准对 basic_istream<>& unget() 的描述(粗体由我添加):

Behaves as an unformatted input function (as described in 27.6.1.3, paragraph 1). After constructing a sentry object, if !good() calls setstate(failbit) which may throw an exception, and return. If rdbuf() is not null, calls rdbuf()->sungetc(). If rdbuf() is null, or if sungetc() returns traits::eof(), calls setstate(badbit) (which may throw ios_base::failure (27.4.4.3)).

所以重要的是它调用了sungetc() ,所以让我们看看标准对此有何规定:

If the input sequence putback position is not available, returns pbackfail(). Otherwise, decrements the next pointer for the input sequence and returns traits::to_int_type(*gptr()).

我没有看到任何明确说明限制的内容,因此值得一试。如果我理解正确,它将调整后备流缓冲区中的指针。所以只要缓冲区中有足够的“历史”,它就应该继续成功。

然而,与 C 不同的是,您似乎永远无法保证它会工作,但您很可能能够 putback 多个字符。

所以我的建议是不要依赖于返回一个以上的字符,并始终检查失败。

关于c++ - unget有任何保证吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6152956/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com