【问题标题】:Using getchar() to store numbers使用 getchar() 存储数字
【发布时间】:2015-04-07 05:36:48
【问题描述】:

我有一个任务,我应该用 C 语言制作一个简单的算术计算器,它接受一个数字、一个运算符和第二个数字的输入,然后执行运算并输出它。听起来很简单吧?

我仅限于专门使用getchar()putchar() 进行数字输入。这意味着我必须一次读取一个字符的整个输入......我很困惑如何读取一个数字的两个字符(例如9191)作为一个号码。如果getchar() 从右到左阅读,这将是一个不同的故事。但不幸的是,它不是……

我将不胜感激!

【问题讨论】:

  • 只需使用malloc 动态分配一个缓冲区,然后将使用getchar 读取的每个字符放入该缓冲区中
  • @BasileStarynkevitch 为什么?这不是必需的。
  • 观察91==9*10+11234567==123456*10+7
  • @n.m.. 确实如此,但 OP 建议如果从右到左阅读,他能够处理。那么最简单的解决方案是读入一个缓冲区并像他知道的那样处理。
  • “最简单”我们主观。它有更多的代码,更多的东西要学,也有更多的犯错机会。

标签: c math calculator getchar putchar


【解决方案1】:

下面是一些伪代码: c = getchar() num = 0 while isdigit(c) num = (num * 10) + (c - '0') c = getchar()

这会累积数字,认识到右边的每个新数字有效地将已经看到的数字乘以 10。当看到非数字时它停止累积,因此解析像 91+3 这样的字符串有效。

【讨论】:

  • 我最喜欢这个答案,因为假设cint,它正确的。尽管问题中没有提到缺少符号处理,但这只是一个小问题。事实上,我认为更大的问题是终止循环的c 的值很容易被遗忘,这可能导致示例中的'+' 被意外丢弃。如果我要像下面的一些答案那样将其放入模块化函数中,我会将ungetc(c, stdin); 放在循环之后...干得好,克雷格。
【解决方案2】:

如果每个输入都是分开的,那么你可以尝试使用循环。

char c = getchar();
int num = 0;
int neg = 0;

if(c == '-') {
   neg = 1;
   c = getchar();
}

while(isdigit(c)) {
    num = num * 10;
    num = num + (c - '0');
    c = getchar();
}

if(neg) {
    num = num * -1;
}

基本上,您一次累积每个数字一个字符。 但是,您需要为即将到来的下一个角色腾出空间。所以你需要将数字乘以 10 才能将其向左移动 1 位。

【讨论】:

【解决方案3】:

定义 ENTER '\n'

int read_num()
{
    int num = 0;
    int c;

    c = getchar() - '0';
    num = (c < 0) ? 0 : c;

    while ((c = getchar()) != ENTER) {
        c -= '0';
        num *= 10;
        num = (num == 0 || num < 0) ? num - c: num + c;
    }

    return num;
}

PS:新代码

#include <stdio.h>

int readnum()
{
    unsigned int c;
    int num = 0;
    int dec;
    int sign = 0;
    
    while ( (c = getchar()) != '\n') {
        
        dec = c - '0';
        if ( dec >= 0 && dec <= 9) {
            num *= 10;
            num = (sign == 1 || num < 0) ? num - dec: num + dec;
        } else if (c == '-') {
            sign = 1;
        } else if (c == '+')
            sign = 0;
        
    }
    return num;
}

int main()
{
    printf("%d\n", readnum());
    return 0;
}

其他解决方案:

#define ENTER '\n'

int read_num()
{
    int num = 0;
    int c;
    int signal = 1;
    
    while ((c = getchar()) != ENTER) {
        
        if (signal == 1 && (c == '-' || c == '+')) {
                signal = (c == '-') ? -1 : 1;
        } else {
            num = num * 10 + (c - '0');
        }
    }

    return num * signal;
}

【讨论】:

  • num = (c &lt; 0) ? 0 : c;,你说?
  • 这验证读取的第一个字节是负号。如果是这样,请添加零,因为只有在读取数字时才能分配信号。
  • 代码没有错,问题是你看不懂。 getchar 返回一个key type 对应的整数,如果他输入负号,使getchar() - '0' ,会给出一个负数,这个数字不是typed 序列的一部分,我们想要的只是他是否是输入负数(以 - 开头)。不要和EOF混淆,看我在做算术(getchar() - '0'),这种情况下EOF不输入。
  • Here 是 C 标准定义字符集的部分...你能告诉我哪个部分要求 '-' 字符小于 '0' 吗?
  • 如果 char 是 '-' getchar() - '0' = -3(十进制的 45 - 48)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-02
  • 2010-11-03
  • 2015-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
相关资源
最近更新 更多