C++ 为什么std::istream::gcount返回的字符比预期的多一个

C++ 为什么std::istream::gcount返回的字符比预期的多一个,c++,C++,我只是想知道为什么这个标准函数在cplusplus.com上返回的示例代码的字符数为9 // cin.gcount example #include <iostream> // std::cin, std::cout int main () { char str[20]; std::cout << "Please, enter a word: "; std::cin.getline(str,20); std::cout << std

我只是想知道为什么这个标准函数在cplusplus.com上返回的示例代码的字符数为9

// cin.gcount example
#include <iostream>     // std::cin, std::cout

int main () {
  char str[20];

  std::cout << "Please, enter a word: ";
  std::cin.getline(str,20);
  std::cout << std::cin.gcount() << " characters read: " << str << '\n';

  return 0;
}
//cin.gcount示例
#包括//标准::cin,标准::cout
int main(){
char-str[20];

std::cout,因为回车键。按enter键时,会出现换行符(
“\n”
)被输入到流中。
getline
读取该换行符,将文本存储在数组中,然后读取并丢弃该换行符。因此,当您读取
simplify
时,实际上读取的是9个字符的
simplify\n

是因为回车键。当您按enter键时,一个换行符(
'\n'
)在C++中,代码> > GETLION/CODE >读取该新行,将文本存储在数组中,然后读取并丢弃新行。因此,当您阅读<代码>简化< /C> >时,您实际上读取了 Simult\N\/Cuff>这是9个字符。真的应该改用

例如,cppreference声明如下:

行为类似于未格式化的PutFunction。在构造和检查sentry对象后,从
*this
中提取字符,并将其存储在数组的连续位置,该数组的第一个元素由
s
指向,直到出现以下任一情况(按所示顺序测试):

  • 输入序列中出现文件结束条件(在这种情况下执行
    setstate(eofbit)

  • 下一个可用字符
    c
    是分隔符,由
    Traits::eq(c,delim)
    确定。分隔符被提取(与
    basic\u istream::get()
    )并向
    gcount()
    计数,但不被存储。

  • 已提取
    count-1
    字符(在这种情况下执行
    setstate(failbit)

如果函数未提取字符(例如,如果
count<1
),则执行
setstate(failbit)

CPluPlus的声明如下:

对于第一种形式,定界字符是换行符('\n');对于第二种形式,定界字符是
delim
当在输入序列中找到时,它从输入序列中提取,但被丢弃,并且不会写入
s

通过调用成员
gcount
可以访问此函数成功读取和存储的字符数

这有点误导,因为这意味着
getline()
只对存储在用户缓冲区中的字符计数,但分隔符不存储在缓冲区中,但它仍然对
gcount()计数

>

通常被许多人认为是C++文档的一个糟糕的站点。你应该使用它。 例如,cppreference声明如下:

行为类似于未格式化的PutFunction。在构造和检查sentry对象后,从
*this
中提取字符,并将其存储在数组的连续位置,该数组的第一个元素由
s
指向,直到出现以下任一情况(按所示顺序测试):

  • 输入序列中出现文件结束条件(在这种情况下执行
    setstate(eofbit)

  • 下一个可用字符
    c
    是分隔符,由
    Traits::eq(c,delim)
    确定。分隔符被提取(与
    basic\u istream::get()
    )并向
    gcount()
    计数,但不被存储。

  • 已提取
    count-1
    字符(在这种情况下执行
    setstate(failbit)

如果函数未提取字符(例如,如果
count<1
),则执行
setstate(failbit)

CPluPlus的声明如下:

对于第一种形式,定界字符是换行符('\n');对于第二种形式,定界字符是
delim
当在输入序列中找到时,它从输入序列中提取,但被丢弃,并且不会写入
s

通过调用成员
gcount
可以访问此函数成功读取和存储的字符数


这有点误导,因为这意味着
getline()
只对存储在用户缓冲区中的字符计数,但分隔符不存储在缓冲区中,但它仍然对结尾处的
gcount()
\n
计数?
\n
计数?