[英]C switch statement , variable error(For a calculator program source code)
大家好,今天在尝试新事物(脑海中突然冒出的概念和风格)时,遇到了一些我不明白为什么会这样的问题。
编码
// This program would get two numbers from user , and request for an arithmetic operator , and carry out arithmetic.
#include <stdio.h>
int main(void)
{
int fNum;
int sNum;
int status = 1;
int operator;
int ans;
printf("Enter the first operand :");
while(scanf("%d" , &fNum) == 0)
;
printf("Please enter the second operand :");
while(scanf("%d" , &sNum) == 0)
;
printf("Which operator you wanted to use\n");
printf("1 for +\n2 for -\n");
while(status)
{
scanf("%d" , &operator);
status = 0;
switch(operator)
{
case 1:
ans = fNum + sNum;
break;
case 2:
ans = fNum - sNum;
break;
default:
status = 1;
}
}
printf("The answer is %d\n" , ans);
return 0;
}
我的分析和问题
第一部分:
1.)有一点我不明白,当我尝试运行此代码时,我从编译器收到一条警告消息, ,但当然我仍然可以运行该程序,因为它不是错误消息。
2.)我只是想知道为什么会出现此警告消息,出于好奇,我不只是声明变量ans
,而是使用 integer 值(0 或任何整数)对其进行初始化,并且警告消息刚刚消失。是什么原因导致发生了吗??是因为变量ans
用于switch
语句,这就是为什么我们应该在使用它之前为其分配一个值?因为一直(当我编写其他程序时)我什至不初始化一个变量在使用它来存储由算术表达式计算的值之前的值。
第二部分:
1.)当程序要求用户输入数字1
或2
作为算术符号时, switch
语句内部会出现问题。
2.)如果我输入的 integer 不在 1 和 2 之内,程序将不会继续,而是等待我重新输入正确的值,这是我的主要意图。
3.)但问题是,如果我输入的值不是 integer 而是一个字符,程序就会冻结,cursor 仍在闪烁,但它不响应我的键盘输入。最后,我必须杀死程序以关闭它。
4.)我知道我有很多方法可以编写这种程序,但我只是想知道为什么在这段代码中会发生这种情况?
第一个问题:
编译器检测到ans
只是有条件地获得分配给它的值(对于您的 switch 语句中的两种特定情况)。 一些编译器对此发出警告,而另一些则没有。 通常,初始化您创建的任何变量始终是一个好习惯。
第二个问题:
这个问题之前已经回答过很多次了——参见无限的 scanf 循环。 问题是 scanf 在这种情况下只接受 integer 。 如此链接中所述,“任何与格式字符串不匹配的字符都会导致它停止扫描并将无效字符留在缓冲区中。” 这导致您的 while 循环永远不会退出。 如果您对更多详细信息感兴趣,此处提到的链接应该对您有所帮助。
问:“警告 #2229:本地 'ans' 可能在未初始化的情况下使用。”
答:这意味着 ans 在声明时可以包含任何值(因为堆栈变量在声明时不会为空) - 并且由于编译器没有看到保证在打印时设置变量的编程逻辑 - 它会引发此警告。 做int ans = 0;
将删除它。
问:如果我输入的值不是 integer 而是一个字符,程序就会死机,cursor 仍然在闪烁,但它对我的键盘输入没有响应。最后,我必须杀死程序才能关闭它。
一个
.
do {
printf("Which operator you wanted to use\n");
printf("1 for +\n2 for -\n");
} while ( scanf("%d", &operator) != 1 );
scanf
返回匹配的数量 --- 如果它不匹配 integer,它将返回 0。因此; 检查返回值。
当您使用变量而没有显式初始化它时,编译器会发出警告。 这是因为未初始化的变量会在您的代码中产生令人讨厌的错误。 例如,考虑以下代码段。
int main()
{
/* NOTE: 'f' is uninitialized */
int f, n;
printf ("\nn : ");
scanf ("%d", &n);
while (n)
f = f * n--;
printf ("\nfactorial = %d", f);
return 0;
}
上述代码中未定义程序的output。 f
是一个局部变量( automatic
),所以当main
开始执行时f
可以有任何值,即垃圾,阶乘计算依赖于f
的初始值。 所以在这种情况下,未初始化的变量会给你带来灾难。 要解决它,您需要执行int f = 1;
你得到正确的 output。 这不是错误,但可能是逻辑错误,因此编译器会帮助您解决此问题,您可能不会不小心留下未初始化的变量。 在你的情况下,它不需要被初始化,所以你可以简单地做ans = 0;
停止警告。
字符和 integer 的解释不同。 例如12
是两个字符,也可以说是integer。 要将其作为 integer 输入,您应该使用"%d"
和字符scanf ("%c%c",&var1, var2);
因为有两个字符。 当你在格式字符串为"%d"
时输入一个字符时,它会检测到输入不是 integer(它是一个字符),并且会在那一刻停止并返回。 operator
变量中不会存储任何内容。 scanf
返回它已读取的组件数。 在这种情况下,当它遇到您输入了一个字符时,它会返回0
,因为它还没有读入输入并且已经停止。 但是,当您输入 integer 时,它将在operator
中正确读取并返回1
。 所以保持检查:
/* Ask for input while the user does not input a
* valid integer.
*/
while (scanf ("%d", &operator) != 1)
{
/* Body is entered whenever an invalid integer is entered */
/* Your message */
}
/* When the user inputs a valid integer the condition
* in 'while' loop is false and program continues
*/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.