-1

我正在编写一个简单的计算程序,但是我可以使用的唯一字符串处理函数是 getchar 和 putchar。现在我只是试图将输入中的数字分配给变量,但是当我打印变量时它是一些随机数。例如,我在控制台中输入 3,输出为 505110。任何帮助将不胜感激。谢谢你。

#include <stdio.h>
#include "math.h"

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 iochar = 0;
char num1 = 0, num2 = 0, continuePrompt, 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;
}
4

5 回答 5

1

代码工作完全正确。当您在 ASCII 中输入“3”时,它实际上是十六进制值0x33,您将在 dec (%d) 中打印该值,因此您将51在输出中看到 a。

现在您无法使用输入的换行符,因此getchar()在第二遍时跳过输入并假设您传入了一个'\n'ASCII,它是十六进制的0xa,因此10接下来会打印。

您不打印任何换行符或空格,因此您将在输出中看到:

3 (I entered that)
5110 (the output from '3''\n')

要解决主要问题,请使用换行符:

int main(int argc, const char * argv[])  {
    int iochar, num1, num2;  
    char continuePrompt = 0, operator;
    do {
      iochar = getchar();  // Get input from user
      getchar(); //Consume new line character

当你打印这些值时,你会得到ASCII值,所以如果你想要 dec,你很好,如果你想要它的字符:

printf("%c", num1);

如果你想用十六进制(0x??)

printf("%#x", num1);

此外,我会打印一个新行或空格或更有用的东西,然后只是一个输出字符串来帮助找到这样的问题。

最后这个条件:

while (continuePrompt != 'no');  

是错的。这不可能发生,检查'n',你不能在单个字符中包含'no'。

于 2012-10-05T03:13:17.537 回答
0

使用%c代替%d

IE

printf("%c", num1);

此外,您应该初始化变量。

IE

int iochar=0, num1=0, num2=0;
char continuePrompt = 0, operator=0;
于 2012-10-05T02:55:13.290 回答
0

由于您只允许使用putcharand getchar,因此我假设您不允许使用printf来呈现结果。为了使用实际数字,putchar您必须获取每个数字并将其转换为正确的 ASCII 值。

幸运的是,这很简单,因为

digitRepresentationASCIIValue == singleDigitValue + '0';

但是,这仅适用于单个数字。因此,您必须获取数字的长度并putchar用于每个数字。这很简单:

void putNumber(int num){
    int order = 1; // even zero has at least one digit
    int tmp = num; // even zero has at least one digit

    while(tmp /= 10)
        order *= 10; // count digits

   if(num < 0)
       putchar('-'); // sign

    while(order > 0){
        // put a single digit, see above how to calculate the ASCII value
        putchar('0' + ( ( num / order ) % 10));
        order /= 10;
    }
}

为了实际读取值,您必须完全相反:检查提供的字符是否getchar是数字,并修改您当前的数字:

int num[2] = {0,0};
int currentNum = 0;
int iochar = getchar();

while(!isNewline(iochar) && iochar != EOF){
    if(isDigit(iochar)){
        num[currentNum] = num[currentNum] * 10 + iochar - '0';
    }
    else if(isOperator(iochar)){
        if(currentNum == 1)
            num[0] = operate(num[0],num[1],operator);
        else
            currentNum = 1;
        operator = iochar;
        num[1] = 0;
    }
    iochar = getchar();
}

isDigitisNewlineisOperand留作练习,这三个都非常简单,但它们会让您更好地了解 ASCII 值。operate包含您的switch陈述。

请注意,我使用了int num[2] = {0,0};. 这使得(除了currentNum)可以编写类似的东西

3 + 3 + 3 / 9

请注意,所有运算符都是从左到右计算的,因此上面示例的结果将是 1 而不是 6.3333333。

练习:

不要在这里发布您的解决方案,而是自己做,因为它们应该可以帮助您提高 ASCII/char 技能。对于某些练习,ASCII 表可能会有所帮助。

  1. 解释为什么数字表示如此简单。提示:ASCII 中定义的数字在哪里以及按什么顺序定义?如果增加 char 的值会发生什么?
  2. 实现缺失isDigitisNewlineisOperand
  3. 输入的代码没有注释,尤其是这一行缺少注释:

        num[currentNum] = num[currentNum] * 10 + iochar - '0';
    

    那里究竟发生了什么?如果num[currentNum]目前对您来说太复杂了,只需使用 num1 并在读取第二个之前打印该值。提示:看看练习#1。

  4. 即使以正确的顺序计算运算符(加法之前的乘法),结果也不会是 6.333333 而是 6。这是为什么呢?在你当前的程序中你必须改变什么?

于 2012-10-06T01:10:01.647 回答
-3

首先,您需要从“getchar”转换输入,因为它是一个 ascii 输入。

    iochar = atoi(getchar());

然后您可以将其与整数值进行比较。

于 2012-10-05T02:53:15.627 回答
-3

首先,返回值getcharis char,提升为int。所以,请使用char变量来存储它。

其次,要将输入转换charint,请使用以下内容:

int num1 = iochar - '0';
于 2012-10-05T02:59:29.360 回答