我在编写计算器程序时遇到了两个障碍。虽然我从计算器中得到了正确的结果,并正确地打印了加法、减法和乘法,但我只是打印了除法结果的?
符号。请参考下面的代码。
static void calculate(int *val1, int *val2, char *op){
float a = *val1;
float b = *val2;
float c = a/b;
/*
A stands for addition, B for sub, C for mul, D for div
I have already verified that the right operation is being
performed
*/
if(strcmp(op,"A")==0)
{
printf("%i \n\r", *val1+*val2);
}else if(strcmp(op,"B")==0)
{
printf("%i \n\r", *val1-*val2);
}else if(strcmp(op,"C")==0)
{
printf("%i \n\r", *val1 * *val2);
}else if(strcmp(op,"D")==0)
{
printf("%f \n\r", c);
}
}
我正在使用实数术语打印我的atmega 32微控制器的结果。
在调试器中,当用户选择的操作是除法“D”时,我确实确认了float c具有正确的值,但它似乎没有与之关联的小数点,尽管它是一个float。
第二个问题:
我想知道我是否可以使用这样的字符数组(字符串):
//please note that below I am just simulating user keystrokes on a keypad attached to a
//microcontroller just for simplifying the problem.
char a[20] = {1,2,3,4,5,\n};
FILE keypad_str = FDEV_SETUP_STREAM(NULL, a, _FDEV_SETUP_READ);
我在上面尝试的是想出一个策略,使我能够立即打印出每个用户按键,而不是将
keypad_str
设置为stdin
,然后在屏幕上打印出整个用户输入的命令字符串。 最佳答案
在除法之前,你不会检查除法是否为零。
不清楚为什么你总是做除法,即使运算是加减或乘法。只有在必要时,您才应该进行划分:
else if (strcmp(op, "D")==0)
{
float a = *val1;
float b = *val2;
if (*val2 == 0)
printf("Divide by zero error\n");
else
{
float c = a / b;
printf("%f\n", c);
}
}
我将变量
c
保留在适当的位置,因为这样可以更容易地调试值。这些都不能解释问号输出。
(您是否必须告诉Atmega 32微控制器上的C编译器在库中包含对浮点的支持?这可能是问号的原因。)
我会选择字符串
"+"
、"-"
、"*"
和"/"
作为操作的助记符;然后我就不需要注释来解释操作的含义了。通常,您不会在格式中包含回车。当你这样做的时候,它通常在新行之前,而不是之后。也不清楚为什么要在输出行的末尾使用空白。
关于FDEV_SETUP_STREAM()的一些问题需要我没有的知识。
但是,C编译器应该告诉您:
char a[20] = {1,2,3,4,5,\n};
无效。你可能是指这两种,它们都是有效的,但有很大的不同:
char a[20] = { 1, 2, 3, 4, 5, '\n' };
char a[20] = { '1', '2', '3', '4', '5', '\n' };
上面的初始值可以缩写为:
char a[20] = "\001\002\003\004\005\n";
char a[20] = "12345\n";
这强调了区别(不,严格来说,双零不是必需的,但有助于说明问题)。
关于c - 在µ Controller 上进行C编程:printf()和FDEV_SETUP_STREAM?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8767791/