2012-11-21 220 views
6

该函数应该读取一个分数并将其放入数组中。如果用户输入'0',则该功能应该退出。我正在尝试使用cin.peek()函数来执行此操作,但执行通常会进入if语句并且不允许用户退出。如何正确使用cin.peek()

我应该如何正确地编写这(我愿意不使用PEEK(),我认为这是做的最简单的方法。)

谢谢!然而

void enterFrac(Fraction* fracs[], int& index) 
    { 
     int n, d; 
     char c, slash; 
     cout << "Enter fractions (end by entering a 0): "; 
     c = cin.peek(); 

     if (c != '0') 
     { 
      cin >> n >> slash >> d; 
      Fraction* f = new Fraction(); 
      f->num = n; 
      f->den = d; 
      fracs[index] = f; 
      index++; 
     } 
    } 

偷看的这种测试()的工作原理:

#include <iostream> 
using namespace std; 

int main() { 
    char c; 
    int n; 
    char str[256]; 

    cout << "Enter a number or a word: "; 
    c=cin.peek(); 

    if ((c >= '0') && (c <= '9')) 
    { 
    cin >> n; 
    cout << "You have entered number " << n << endl; 
    } 
    else 
    { 
    cin >> str; 
    cout << " You have entered word " << str << endl; 
    } 

    return 0; 
} 
+0

我添加了一个案例,我可以让peek()正常工作,但我没有看到是什么原因导致了我的情况。 – Zzz

回答

11

有与您使用的std::istream::peek()两个问题:

  1. 此功能访问下一个字符,确实跳过主要的空白。在确定下一个字符是什么之前,您可能想跳过前导空格,例如使用操纵器std::ws(std::cin >> std::ws).peek()
  2. std::istream::peek()的结果不是char。相反,它是一个std::char_traits<char>::int_type(这是一个奇怪的拼写int)。结果可能是,例如,std::char_traits<char>::eof(),如果'0'的值恰好是负数(我不知道任何平台在哪里;但是,例如,我的名字'ü'中的有趣字符在平台上为负值,其中char被签名),你也不会得到正确的结果。也就是说,你通常比较结果std::istream::peek()反对std::char_traits<char>::to_int_type()的结果,即,你会使用这样的:std::cin.peek() == std::char_traits<char>::to_int_type('0')

这就是说,你的程序不检查它是否可以成功地读取提名者和分母,斜线分隔。您总是要验证读书是成功的,例如,使用类似

if ((std::cin >> nominator >> slash >> denominator) && slash == '/') { 
    ... 
} 

只是为了娱乐,你可以创建一个机械手进行测试,一个字符是一斜线,确实:

std::istream& slash(std::istream& in) { 
    if ((in >> std::ws).peek() != std::char_traits<char>::to_int_type('/')) { 
     in.setstate(std::ios_base::failbit); 
    } 
    return in; 
} 

这样,你可以封装斜线测试。如果你需要在多个地方使用它,这是非常方便的。

+0

这真的是有用的信息,但我仍然留下相同的问题,除非我不明白你的解释中的某些内容:)。当用户输入'0'时,执行输入if语句。 – Zzz

+0

我粘贴使用peek()的代码(在问题中),但我无法弄清楚如何在我的用例中应用它。 – Zzz

+0

您是否添加了空格跳过,即这个小小的'std :: ws'位?我准备打赌你在测试中看到的角色是某种空间,很可能是换行符。 –