返回

发现一个拖拉且错误的猜数字程序中的隐藏问题

见解分享

你是否曾经写过一个看似完美的程序,但在运行时却遇到了奇怪的错误?如果你有,你并不孤单!

本文将深入探讨一个看似简单的猜数字程序中一个微妙但令人头疼的错误,该错误源自一个意想不到的地方——换行符。

背景

让我们从一个简单的猜数字程序开始:

// 猜数字程序

#include <iostream>

using namespace std;

int main() {
  int guess;
  char answer;
  
  cout << "请输入你的猜测 (1-100): ";
  cin >> guess;
  
  do {
    cout << "你的猜测是否正确? (y/n): ";
    cin >> answer;
  } while (answer != 'y');
  
  cout << "恭喜!你猜对了!" << endl;
  
  return 0;
}

该程序提示用户输入一个数字,然后提示他们回答该猜测是否正确。如果猜测不正确,程序会继续提示用户,直到他们输入 'y'。

错误的根源

乍一看,此程序似乎运行正常。但是,如果我们仔细观察,就会发现一个奇怪的行为:每次用户输入除 'y' 之外的字符时,程序都会打印两条消息。

这是怎么回事?

原因在于这个麻烦的换行符。缓冲输入要求用户按下 Enter 键发送输入。程序读取了除 'y' 字符作为用户否定了数字 1,然后还读取了一个换行符作为用户否定了数字 2。

要解决此问题,我们需要引入一个额外的 while() 循环来清除缓冲区中的换行符:

// 猜数字程序(已修复)

#include <iostream>

using namespace std;

int main() {
  int guess;
  char answer;
  
  cout << "请输入你的猜测 (1-100): ";
  cin >> guess;
  
  do {
    // 清除缓冲区中的换行符
    while (cin.peek() != '\n' && cin.get() != '\n');
    
    cout << "你的猜测是否正确? (y/n): ";
    cin >> answer;
  } while (answer != 'y');
  
  cout << "恭喜!你猜对了!" << endl;
  
  return 0;
}

教训

这个错误突出表明了在编写程序时注意细节的重要性。即使是最微小的疏忽也可能导致意外的后果。

因此,下次在编写代码时,请务必:

  • 彻底测试你的程序以查找任何意外行为。
  • 考虑所有可能的输入,包括不寻常或无效的输入。
  • 使用适当的技术(例如清除缓冲区)来处理用户输入。

通过遵循这些最佳实践,你可以大大减少编写错误和令人头疼的程序的可能性。