没有从C中的getchar获得正确的变量赋值

时间:2012-10-05 02:50:47

标签: c getchar putchar

我正在编写一个简单的计算程序,但是我可以使用的唯一字符串处理函数是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;
}

5 个答案:

答案 0 :(得分:1)

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

现在你没有使用输入的换行符,所以getchar()正在跳过第二遍的输入并且假设你传入'\n' ASCII,这是十六进制{{接下来打印1}},然后打印0xa

您不会在输出中打印任何换行符或空格,如下所示:

10

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

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

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

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

如果你想要它的十六进制(0x ??)

printf("%c", num1);

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

最后这个条件:

printf("%#x", num1);

错了。这是不可能的,检查'n',你不能在一个字符中'不'。

答案 1 :(得分:0)

使用%c代替%d

printf("%c", num1);

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

int iochar=0, num1=0, num2=0;
char continuePrompt = 0, operator=0;

答案 2 :(得分:0)

由于您只允许使用putchargetchar,因此我认为您不允许使用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 table可能会有所帮助。

  1. 解释为什么数字表示如此简单。提示:在ASCII中定义的数字的位置和顺序是什么?如果增加char的值会发生什么?
  2. 实施遗失的isDigitisNewlineisOperand
  3. 未对注释的代码进行注释,尤其是此行缺少注释:

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

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

  4. 即使以正确的顺序评估运算符(加法前的乘法),结果也不会是6.333333而是6.为什么会这样?您目前的计划需要改变什么?

答案 3 :(得分:-3)

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

    iochar = atoi(getchar());

然后你可以将它与整数值进行比较。

答案 4 :(得分:-3)

首先,getchar的返回值为char,提升为int。因此,请使用char变量来存储它。

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

int num1 = iochar - '0';