坏:C++;#输入输出调试 这是我的C++作业调试问题,是关于I/O的,我调试了很多错误。程序没有报告错误,但其结果是错误的。 其结果应该是: 输入一个数字:2.3456 输入一个数字:0.895 x的值为:+2.346000000 y的值为:8.95e-001 但我的结果是: 输入一个数字:2.3456 输入一个数字:0.895 x的值为:

坏:C++;#输入输出调试 这是我的C++作业调试问题,是关于I/O的,我调试了很多错误。程序没有报告错误,但其结果是错误的。 其结果应该是: 输入一个数字:2.3456 输入一个数字:0.895 x的值为:+2.346000000 y的值为:8.95e-001 但我的结果是: 输入一个数字:2.3456 输入一个数字:0.895 x的值为:,c++,C++,它没有给我正确的x,也没有给我正确的y 我不知道怎么了 我的代码: // Debugging problem #include <iostream> using std::cout; using std::endl; using std::cin; using std::ios; #include <iomanip> using std::setw; using std::setprecision; using std::resetiosflag

它没有给我正确的x,也没有给我正确的y

我不知道怎么了

我的代码:

    // Debugging problem 

    #include <iostream>

using std::cout;
using std::endl;
using std::cin;
using std::ios;

#include <iomanip>

using std::setw;
using std::setprecision;
using std::resetiosflags;

double readNum();
double printFormatted( double, double );

int main()
{
   double x, y;

   x = readNum();
   y = readNum();
   printFormatted( x, y );

   return 0;
}

double readNum()
{
   double num = 0;
   double place = 10;

   cout << "Enter a number: ";
 //  num = cin.getline() - '0';
   num = cin.get() - '0';

   while ( cin.peek() != '.' && cin.peek() != '\n' )
    //  num = num * 10 + atof( cin.get() );
     num = num * 10 + static_cast<double>(cin.get());

   while ( cin.peek() != '.' )
   {
      num = num + static_cast< double >
         ( cin.get() ) / place;
      place *= 10;
   }
   cin.ignore();

   return num;
}

double printFormatted( double x, double y )
{
   char buffer[] = "The value of x is: ";

   for ( int i = 0; buffer[ i ] != '\n'; i++ )
      cout.put( buffer[ i ] );

   cout << setw( 12 ) << setprecision( 3 )
        << std::setfill( '0' ) 
        << std::setiosflags( ios::fixed | ios::showpoint |
           ios::left)
        << x << endl;

 //  cout.write("The value of y is: ");
   char buffe[] = "The value of y is: ";

   for (int i = 0; buffe[i] != '\n'; i++)
       cout.put(buffe[i]);
   cout << resetiosflags( ios::showpoint )
        << setprecision( 2 )
        << std::setiosflags( ios::scientific | ios::right )
        << y << endl;
   return 0;
}
//调试问题
#包括
使用std::cout;
使用std::endl;
使用std::cin;
使用std::ios;
#包括
使用std::setw;
使用std::setprecision;
使用std::resetiossflags;
双readNum();
双重打印格式(双重,双重);
int main()
{
双x,y;
x=readNum();
y=readNum();
打印格式(x,y);
返回0;
}
双readNum()
{
双数=0;
双位=10;
库特
(cin.get())/place;
地点*=10;
}
cin.ignore();
返回num;
}
双打印格式(双x,双y)
{
char buffer[]=“x的值为:”;
对于(int i=0;缓冲区[i]!='\n';i++)
cout.put(缓冲器[i]);
库特
  • 您可以删除这些行
  • 只要写

    cout << buffer;
    
  • 您对
    cout
    使用了不同的标志,但忘记了它们不会被重置。 在使用之前,必须保存默认标志并还原
  • 总之

    double readNum();
    double printFormatted( double, double );
    
    std::ios_base::fmtflags defaultFlags(cout.flags());
    
    int main()
    {
       double x, y;
    
       x = readNum();
       y = readNum();
       printFormatted( x, y );
    
       return 0;
    }
    
    double readNum()
    {
       double num = 0;
       double place = 10;
    
       cout << "Enter a number: ";
       num = cin.get() - '0';
    
       while ( cin.peek() != '.' && cin.peek() != '\n' ) {
         num = num * 10 + cin.get() - '0';
       }
    
       if (cin.peek() == '.') {
         cin.get();
       }
    
       while (cin.peek() != '\n')
       {
          num = num + (cin.get() - '0') / place;
          place *= 10;
       }
       cin.ignore();
    
       return num;
    }
    
    
    double printFormatted( double x, double y )
    {
       char buffer[] = "The value of x is: ";
       cout << buffer
            << setw( 12 ) << setprecision( 3 )
            << std::setfill( '0' )
            << std::setiosflags( ios::fixed | ios::showpoint |
               ios::left)
            << x << endl;
    
       cout.flags(defaultFlags);
    
       char buffe[] = "The value of y is: ";
       cout << buffe
           << resetiosflags( ios::showpoint )
            << setprecision( 2 )
            << std::setiosflags( ios::scientific | ios::right )
            << y << endl;
       return 0;
    }
    
  • 您可以删除这些行
  • 只要写

    cout << buffer;
    
  • 您对
    cout
    使用了不同的标志,但忘记了它们不会被重置。 在使用之前,必须保存默认标志并还原
  • 总之

    double readNum();
    double printFormatted( double, double );
    
    std::ios_base::fmtflags defaultFlags(cout.flags());
    
    int main()
    {
       double x, y;
    
       x = readNum();
       y = readNum();
       printFormatted( x, y );
    
       return 0;
    }
    
    double readNum()
    {
       double num = 0;
       double place = 10;
    
       cout << "Enter a number: ";
       num = cin.get() - '0';
    
       while ( cin.peek() != '.' && cin.peek() != '\n' ) {
         num = num * 10 + cin.get() - '0';
       }
    
       if (cin.peek() == '.') {
         cin.get();
       }
    
       while (cin.peek() != '\n')
       {
          num = num + (cin.get() - '0') / place;
          place *= 10;
       }
       cin.ignore();
    
       return num;
    }
    
    
    double printFormatted( double x, double y )
    {
       char buffer[] = "The value of x is: ";
       cout << buffer
            << setw( 12 ) << setprecision( 3 )
            << std::setfill( '0' )
            << std::setiosflags( ios::fixed | ios::showpoint |
               ios::left)
            << x << endl;
    
       cout.flags(defaultFlags);
    
       char buffe[] = "The value of y is: ";
       cout << buffe
           << resetiosflags( ios::showpoint )
            << setprecision( 2 )
            << std::setiosflags( ios::scientific | ios::right )
            << y << endl;
       return 0;
    }
    

    for(int i=0;buffer[i]!='\n';i++)
    --字符串文字不保证以
    '\n'
    结尾。这是读取超过
    缓冲区
    数组的结尾。将其更改为
    '\0'
    。更好的是,
    不知道为什么您要以这种方式读取数字,而不是
    cin>>num
    (int i=0;buffer[i]!='\n';i++)
    --字符串文字不保证以
    '\n'
    结尾。这是读取超过
    缓冲区
    数组的结尾。将其更改为
    '\0'
    。更好的是,
    不能用这种方式读取数字,而不是
    cin>>num
    std::ios_base::fmtflags defaultFlags(cout.flags());
    cout.flags(defaultFlags);
    
    double readNum();
    double printFormatted( double, double );
    
    std::ios_base::fmtflags defaultFlags(cout.flags());
    
    int main()
    {
       double x, y;
    
       x = readNum();
       y = readNum();
       printFormatted( x, y );
    
       return 0;
    }
    
    double readNum()
    {
       double num = 0;
       double place = 10;
    
       cout << "Enter a number: ";
       num = cin.get() - '0';
    
       while ( cin.peek() != '.' && cin.peek() != '\n' ) {
         num = num * 10 + cin.get() - '0';
       }
    
       if (cin.peek() == '.') {
         cin.get();
       }
    
       while (cin.peek() != '\n')
       {
          num = num + (cin.get() - '0') / place;
          place *= 10;
       }
       cin.ignore();
    
       return num;
    }
    
    
    double printFormatted( double x, double y )
    {
       char buffer[] = "The value of x is: ";
       cout << buffer
            << setw( 12 ) << setprecision( 3 )
            << std::setfill( '0' )
            << std::setiosflags( ios::fixed | ios::showpoint |
               ios::left)
            << x << endl;
    
       cout.flags(defaultFlags);
    
       char buffe[] = "The value of y is: ";
       cout << buffe
           << resetiosflags( ios::showpoint )
            << setprecision( 2 )
            << std::setiosflags( ios::scientific | ios::right )
            << y << endl;
       return 0;
    }
    
    Enter a number: 2.456
    Enter a number: 0.895
    The value of x is: 2.4560000000
    The value of y is: 8.95e-01