【问题标题】:Difference between cin and cin.get() for char arraychar 数组的 cin 和 cin.get() 之间的区别
【发布时间】:2015-06-20 06:00:24
【问题描述】:

我有这两个代码:

char a[256];
cin>>a;
cout<<a;

char a[256];
cin.get(a,256);cin.get();
cout<<a;

也许,相对于第二个没有 cin.get();

char a[256];
cin.get(a,256);
cout<<a;

我的问题是(第一个):对于 char 数组,我应该使用什么? cin 还是 cin.get()?我为什么要使用 cin.get();我的 char 初始化后没有参数?

我的第二个问题是:我的 c++ 老师教我每次使用 cin.get() 初始化字符,并在每次初始化 char 数组或 int 数组或只是 int 或其他任何时间后,再次放入 cin.get();在它之后。这就是我最初想问的。

所以,现在我得到了这 2 个: 在这种情况下,在整数初始化后没有 cin.get() ,我的程序将中断,我不能再做我的 char 初始化。

int n;
cin>>n;
char a[256];
cin.get(a,256); cin.get();  // with or without cin.get();?
cout<<a;

还有一个正确的:

int n;
cin>>n; cin.get();
char a[256];
cin.get(a,256); cin.get(); // again, with or without?
cout<<a;

那么,怎么了?请有人解释每个案例!谢谢。

【问题讨论】:

    标签: c++ arrays string namespaces cin


    【解决方案1】:

    他们做不同的事情,所以选择你想要的,或者下面给出的更好的选择。

    第一个cin&gt;&gt;a; 读取单个单词,跳过任何前导空格字符,并在遇到空格字符(包括行尾)时停止。

    第二个cin.get(a,256);cin.get(); 读取整行,然后使用行尾字符,这样重复此操作将读取下一行。 cin.getline(a,256) 是一种更简洁的方法。

    第三个cin.get(a,256) 读取整行,但将行尾字符留在流中,因此重复此操作不会提供更多输入。

    在每种情况下,如果输入的单词/行长于固定大小的缓冲区,您都会遇到某种不良行为。因此,您通常应该使用更友好的字符串类型:

    std::string a;
    std::cin >> a;              // single word
    std::getline(std::cin, a);  // whole line
    

    字符串会增长以适应任何数量的输入。

    【讨论】:

      【解决方案2】:

      问题很可能在于您稍后输入值的方式。每次初始化后的cin.get() 用于“抓取”每次按下回车键时放入流中的换行符。 假设您开始像这样输入您的值:

      2 
      
      a b c d...
      

      假设你在 2 之后按下了回车,换行符也被放到了流中。当您在那之后调用cin.get() 时,它会抓取并丢弃换行符,从而让您的其余代码能够正确获取输入。

      要回答您的第一个问题,对于数组,您应该使用 cin.get 而不是重载的运算符 &gt;&gt; cin&gt;&gt;,因为这只会抓取一个单词,并且不会限制抓取的字符数量,这可能会导致溢出和数据损坏/程序崩溃。

      另一方面,cin.get() 允许您指定读取的最大字符数,防止此类错误。

      【讨论】:

        【解决方案3】:

        对于 char 数组,请使用 cin.get(),因为它计算空格,而 cin 不计算。更重要的是,cin.get() 设置了要读取的最大字符数。例如:

         char foo[25]; //set maximum number of characters 
         cout << "Please type in characters for foo" << endl; 
         cin.get(foo,25);  
         cout << ' ' << foo;  
        

        在这种情况下,您只能输入 24 个字符和一个空终止符 \0
        我希望这能回答你的第一个问题。 我个人会使用字符串。

        【讨论】:

          猜你喜欢
          • 2015-01-08
          • 1970-01-01
          • 1970-01-01
          • 2018-11-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-19
          • 2014-11-07
          相关资源
          最近更新 更多