在VIsual C ++中使用C ++代码,只是忽略了错误,但代码的某些部分被忽略了

时间:2010-10-22 06:22:11

标签: c++ visual-c++

我是编程的绝对初学者,我只是在一开始就做一些练习练习。

首先,我使用Visual C ++ 2010编译C代码。我只是创建一个新项目并选择一个空的控制台应用程序。之后,我创建了一个名为test.c的资源文件,并将文件属性中的元素类型更改为C / C ++编译器并编译为C ++代码,以便我可以使用#include <iostream>作为std::cin.get()命令。现在代码:

#include <stdio.h>
#include <iostream>

int main() 
{
   int number1, number2;
   int sum;

   puts("Enter number 1 please:");
      scanf_s("%d",&number1);
   puts("Enter number 2 please:");
      scanf_s("%d",&number2);

   std::cin.get();
   std::cin.get();  //(1)

   sum = number1 + number2;
      printf("The average is %f\n", sum/2);

return 0; 
}

现在我的问题是“std :: cin.get()”命令被忽略了。输入两个数字后,程序就会停止,控制台窗口关闭。

知道问题出在哪里?

我还有其他问题。

由于我解决了控制台打开的问题(1),现在我的printf()只给出零作为输出。我希望有一个浮点数作为输出,但无论我输入的是number1和number2,我总是得到“0.000000”。

由于我还在处理我的小程序以在接受之前验证输入,我还有另外一个问题。

我想使用以下代码来检查输入。

#include <stdio.h>
#include <iostream>
#include <ctype.h>

int main() 
{
   int number1, number2;
   int sum;

   puts("Enter number 1 please:");
      scanf_s("%d",&number1);

   if (isdigit(number1)) 
   {
   puts("Enter number 2 please:");
      scanf_s("%d",&number2);
   }
   else 
   {
   puts("Your input is not correct. Enter a number please.");
   }

   std::cin.get();
   std::cin.get();

   /*



   sum = number1 + number2;
      printf("The average is %f\n", sum/2);  */

return 0; 
}

嗯它不起作用。我输入一个数字,我的回答是“你的输入不是......”。我使用了搜索并找到了以下内容:Check if User Inputs a Letter or Number in C。不幸的是,这些建议对我没有帮助。

4 个答案:

答案 0 :(得分:11)

它没有被忽视。当您键入第二个数字,然后按Enter键,它会在输入流中输入您的数字和换行符。 scanf删除数字,但只保留换行符。当你调用cin.get()时,由于流中有一个字符,它不会等待你的输入。

答案 1 :(得分:0)

PigBen has already given you a good explanation of where you err.但是,我有一些关于你的程序的附加点,这些点不符合评论:


您正在混合C和C ++输入。为什么? std::cin >> number1出了什么问题? 当您将number1更改为double时,您需要记住 更改scanf()中的格式化字符串 ,而使用IO流时,编译器将找出适合你的一切。使用流和C ++的字符串,容器和其他数据结构,执行编译的东西要困难得多,但在运行时调用可怕的 Undefined Behavior


另请注意,您 无法检查输入操作是否成功 。如果我调用你的程序会发生什么,而不是传递数字,我输入非数字? 切勿使用未经验证的用户,文件或其他外部来源的输入。
使用IO流,输入操作符>>返回(引用)流,您可以像使用布尔一样使用流,这样就可以了

if(std::cin >> number1)
  // input succeeded

if( !(std::cin >> number2) )  // note the negation operator !
  // input error

检查。

输入/输出错误后,流在内部进入错误状态。在遇到错误的流上,任何进一步的IO操作都将失败。因此,如果需要,可以延迟输入验证,直到完成所有输入操作:

std::cout << "Enter number 1 please:";
std::cin >> number1;
std::cout << "Enter number 2 please:";
std::cin >> number2;

if(!std::cin) 
  // input error

但是,请记住 在首次使用之前始终验证输入

请注意,我没有检查输出是否有错误。那是因为很难想象输出到控制台会出现问题。 (你会怎么做?打印错误信息?)但是,如果你写入文件,请记得 检查输出 。文件操作很容易出错。

答案 2 :(得分:0)

在回答您修改过的问题时,这是因为您正在使用整数进行划分。将int sum更改为float sum,一切都应该没问题。

答案 3 :(得分:0)

要回答您修改后的问题:您使用的%f printf()格式为int,但这不起作用。如果要打印浮点数,则需要传递double。您可以打印(double)sum / 2甚至sum / 2.0,两者都会产生double秒。 (不,float对于像printf()这样的可变函数不起作用。)实际上,你传递的可能是一个四字节类型并告诉printf()将它视为不同格式的八字节类型,因此难怪你没有得到预期的结果。

或者,您可以切换到C ++ iostreams,这可以节省匹配类型和了解默认促销的问题。你仍然可以从sum/2获得一个整数,这将会减少任何一半,但这将是正确的结果。