cin.getline()使用更大的缓冲区大小

6
#include<iostream>
using namespace std;

int main()
{
   char test[10];
   char cont[10];

   cin.getline(test,10);
   cin.getline(cont,10);

   cout<<test<<" is not "<<cont<<endl;
    return 0;
}

当我输入:

12345678901234567890

输出结果为:

123456789

看起来 cont 是空的。有人可以解释一下吗?
(说明:此处的“cont”是指代码中的变量名称,未提供更多上下文信息)

1
给大家一个忠告:最好忘掉 cin.getline 的存在,改用 std::getline。虽然 std::getline 也不是完美的,但在绝大多数情况下,它肯定会有所提升。 - Jerry Coffin
5个回答

11

istream::getline方法如果输入太长,则会设置fail bit,这将阻止进一步的输入。请更改你的代码:

#include<iostream>
using namespace std;

int main()
{
   char test[10];
   char cont[10];

   cin.getline(test,10);
   cin.clear();                    // add this
   cin.getline(cont,10);

   cout<<test<<" is not "<<cont<<endl;
    return 0;
}

谢谢,"istream::getline如果输入过长会设置失败位,这可以防止进一步的输入。" 这正是我想听到的。 - deryk

6

如果你读入的变量不够大,无法容纳整行数据,输入操作将失败,并且流在调用 cin.clear() 之前将不再读取任何内容。

你应该使用 std::string 来存储数据。它会自动调整大小以匹配输入。

std::string test;
std::string cont;

getline(cin, test);
getline(cin, cont);

你的回答也很好。谢谢。cin.clear()对于解决问题非常重要。 - deryk

0

标准规定,您可以在以下情况下获得比输入更短的“行”:

  1. 您使用的C++可能不符合标准。- 不可能。
  2. 您在某个地方遇到了类似于EOF的字符。

我的猜测是将char[]更改为string (STL),然后尝试一下。此外,当您说您一次性输入12345678901234567890时,所有内容都会进入test。由于test只有10个字节长,因此将输出123456789。由于istream类设置了failbit并阻止了进一步的输入,因此未输入任何内容到cont。这段代码对我来说使用std::string有效。

    #include<iostream>
    #include <string>
    using namespace std;

    int main()
    {
       //char test[10];
       //char cont[10];

       string test;
       string cont;

       cin >> test;
       cin >> cont;

       //cin.getline(test,10);
       //cin.getline(cont,10);

       cout<<test<<" is not "<<cont<<endl;
        return 0;

}

0

从某个地方复制

cin.getline从输入序列中提取字符,并将它们作为C字符串存储到从s开始的数组中。

字符被提取,直到提取了(n-1)个字符或找到定界字符为止(如果指定了该参数,则是delim;否则是'\n')。 如果在输入操作期间到达输入序列的文件结尾或发生错误,则提取也会停止。

我相信你在输入12345678901234567890后按了两次回车键。


0

getline()函数有以下两种语法:

istream& getline (char* s, streamsize n );
istream& getline (char* s, streamsize n, char delim );

s: 指向字符数组的指针,提取的字符存储为c字符串。

n: 写入到s中的最大字符数(包括终止空字符)。

delim: 显式定界字符

该函数的返回类型为 istream object (*this)

在上述情况下,数据被读入到指向字符数组test的指针中,该指针在运行时转换,因此可以存储最多50个字符,如cin.getline(test, 50)中所声明。

如果您想达到您的期望结果,请使用n=10


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