我是编程的绝对初学者,我只是在一开始就做一些练习练习。
首先,我使用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。不幸的是,这些建议对我没有帮助。
答案 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
获得一个整数,这将会减少任何一半,但这将是正确的结果。