1

次のコードをご覧ください

#include <iostream>
#include <iomanip>

using namespace std;

double hypontenuse(double,double);


int main()
{
    double side1 = 0;
    double side2 = 0;

    cout << "Enter side1 (-1 to exit)" << endl;
    cin >> side1;

    while(true)
    {

        if(side1==-1)
        {
            break;
        }

        cout << "Enter side2" << endl;
        cin >> side2;

        double result = hypontenuse(side1,side2);

        cout << "The Hypontenuse of the Right Triangle is: " << setprecision(2) << fixed << result << endl;


        cout << "Enter side1 (-1 to exit)" << endl;
        cin >> side1;
    }
} 

double hypontenuse(double side1, double side2)
{
    double result = (side1*side1)+(side2*side2);

    return result;
}

私はC++を初めて使用します。このコードでは、無効な入力(スペース、タブ、文字など)を指定すると、このコードは突然無限ループになります。そのような無効な入力を無視し、メッセージを表示して、開始位置に戻る必要があります。どうやってやるの?助けてください!

4

2 に答える 2

1

入力が成功したかどうかを常に確認する必要があります。通常、これはストリームをブール値に変換するだけで行われます。

if (std::cin >> value) {
    process(value);
else {
    // recover from the error
}

間違った入力からの回復は、少なくとも 2 つの部分で構成されます。

  1. ストリームを何かを実行する状態に戻します (例: を使用) std::cin.clear()
  2. 問題のある入力を取り除きます。これが正確にどのように行われるかは、ニーズによって異なります。たとえば、個々の文字または行末までのすべてを無視できる場合があります。

文字を無視するコードは、次のいずれかのようになります。

std::cin.ignore(); // ignores one character
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // ignore until end of line
于 2012-10-07T17:47:56.760 に答える
0

個人的には、古き良き C の "fgets()" と "sscanf()" を使用することをお勧めします。

ただし、このリンクを見てください。

次のことを行います。

1)std::getline(std::cin, str)生の入力を読み取るために使用します(「fgets」に類似)

2)std::ws不要な空白 (タブ、文字、改行など) を食べるために使用します。

残念ながら、入力の検証には役立ちません(sscanf() が 1 つのステートメントで実行します)。

「それが役立つことを願っています

================================================== ============

Q: 私のコードを編集してもらえますか? 理解するのは少し難しいです:( – Sepala

A: 結構です。ここに行きます:

#include <stdio.h>

double 
hypontenuse(double side1, double side2)
{
    return (side1*side1)+(side2*side2);
}


int 
main(int argc, char *argv[])
{
    double side1 = 0;
    double side2 = 0;
    char buff[80];

    while(true)
    {
      printf ("Enter side1 and side2 (-1 to exit): ");
      fgets (buff, sizeof (buff), stdin);
      int iret = sscanf (buff, "%lf %lf", &side1, &side2);
      if (side1 == -1)
        break;
      if (iret != 2)
        continue;

      double result = hypontenuse(side1,side2);
      printf ("The Hypontenuse of the Right Triangle is: %.02lf\n", result);
    }
    printf ("Done.\n");
    return 0;
} 
于 2012-10-07T17:47:44.617 に答える