输出作为一个颠倒的问号和提示在C中的计算器程序中出现两次

时间:2012-10-06 01:48:06

标签: c getchar putchar

我正在编写一个简单的计算程序,但我无法获得任何有效的输出。我所得到的只是一个颠倒的问号。此外,我在程序结束时有一个提示,询问用户是否要输入另一个计算。但是,当我输入计算时,控制台中会出现两次提示。有谁知道为什么会发生这些事情?最后,我只能使用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;
}

2 个答案:

答案 0 :(得分:0)

函数getchar并从控制台获取字符putchar字符放入控制台。这不是一般的输入/输出功能。您的代码读取时希望getchar读取整数的十进制表示形式,而putchar读取整数的十进制表示形式,但它们不能以这种方式工作。由于您只能使用getcharputchar,因此您必须使用它们编写自己的输入/输出方法来解析输入并正确显示它们。首先,弄清楚如何解析和输出整数。然后使用那些您希望读取或写入整数的方法(如果必须显示除法的估计值,则使用浮点数)。有一个辅助方法可能有助于实际从表达式中的任何位置抓取“当前”数字字符串。

答案 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的发明者自己编写。