我正在编写一个简单的计算程序,但我无法获得任何有效的输出。我所得到的只是一个颠倒的问号。此外,我在程序结束时有一个提示,询问用户是否要输入另一个计算。但是,当我输入计算时,控制台中会出现两次提示。有谁知道为什么会发生这些事情?最后,我只能使用getchar和putchar来处理输入和输出。在此先感谢您的帮助。
int addFunction( int, int);
int subtractFunction(int, int);
int multiplyFunction(int, int);
int modulusFunction(int, int);
float divideFunction(float, float);
int main(int argc, const char * argv[])
{
int num1 = 0, num2 = 0, result = 0;
char continuePrompt, iochar = 0, operator = 0;
do {
iochar = getchar();
getchar();
if ((iochar >= 0) && (iochar <= 20000)) {
num1 = iochar;
}
if ((iochar == '+') || (iochar == '-') || (iochar == '*') || (iochar == '/') || (iochar == '%')) {
operator = iochar;
}
if ((num1 >= 0) || ((iochar >= 0) && (iochar <= 20000))){
num2 = iochar;
}
switch (operator) {
case '+':
iochar = addFunction(num1, num2);
break;
case '-':
iochar = subtractFunction(num1, num2);
break;
case '*':
iochar = multiplyFunction(num1, num2);
break;
case '%':
iochar = modulusFunction(num1, num2);
break;
case '/':
iochar = divideFunction(num1, num2);
break;
}
putchar(iochar);
printf("Would you like to make another calulation? (y or n)");
scanf("%c", &continuePrompt);
} while (continuePrompt != 'n');
return 0;
}
int addFunction(int x, int y){
return x + y;
}
int subtractFunction(int x, int y){
return x - y;
}
int multiplyFunction(int x, int y){
return x * y;
}
int modulusFunction(int x, int y){
return x % y;
}
float divideFunction(float x, float y){
return x / y;
}
答案 0 :(得分:0)
函数getchar
并从控制台获取字符,putchar
将字符放入控制台。这不是一般的输入/输出功能。您的代码读取时希望getchar
读取整数的十进制表示形式,而putchar
读取整数的十进制表示形式,但它们不能以这种方式工作。由于您只能使用getchar
和putchar
,因此您必须使用它们编写自己的输入/输出方法来解析输入并正确显示它们。首先,弄清楚如何解析和输出整数。然后使用那些您希望读取或写入整数的方法(如果必须显示除法的估计值,则使用浮点数)。有一个辅助方法可能有助于实际从表达式中的任何位置抓取“当前”数字字符串。
答案 1 :(得分:0)
一些基础......
字符值'0'不等于ascii中的整数值0,它具有整数值48.如果您只是将每个数字都设为1位数,则它将类似于:
char c = getchar();
// Assuming the user only will input a number...
int number = c - '0';
对于只用getchar()读取整数,我会做类似的事情:
#include <stdio.h>
#include <math.h> // for pow
int getint()
{
char c;
char buffer[255]; // way larger than an integer will ever be I think...
int numlen = 0;
int number = 0;
int x;
int multfornegative = 1;
while ((c = getchar()) != '\n') {
buffer[numlen++] = c;
}
for (x = numlen - 1; x >= 0; x--) {
c = buffer[(numlen - 1) - x];
if (c == '-') {
multfornegative *= -1;
} else {
number += (c - '0') * (int)pow(10, x);
}
}
return number * multfornegative;
}
输出你会做类似......
void putint(int number)
{
char digit;
int x;
int start;
if (number < 0) {
putchar('-');
number *= -1;
}
start = log(number) / log(10);
for (x = start; x >= 0; x--) {
digit = ((number / (int)pow(10, x)) % 10) + '0';
putchar(digit);
}
}
另外,试着打破你的输入,你在循环中拥有它的方式最终会让人感到困惑,这会弄乱你的逻辑。
int num1;
char op;
int num2;
int ans;
do {
num1 = getint();
op = getchar(); getchar();
num2 = getint();
switch(op) {
case '+': ans = num1 + num2; break;
case '-': ans = num1 - num2; break;
// And so on...
}
putint(ans);
while (1);
The C Programming Language是一本很棒的书,用于学习C,由C的发明者自己编写。