putchar()可以打印整数吗?

问题描述 投票:1回答:5

如何仅在putchar()的帮助下打印整数。我想做到这一点而无需使用外部存储。去年的一次采访中问了这个问题。

c file-io integer output putchar
5个回答
5
投票

在面试中遇到含糊的要求时,表达您的假设是个好主意。

我将只能使用putchar的要求表示它是唯一允许我调用的库函数。我还要进一步假设“没有外部存储”意味着我无法显式创建缓冲区。如果访问者同意我的假设,我将继续:

void pr_int(int n) {
    if (n < 0) {
        putchar('-');
        n = -n;
    }
    if (n / 10 != 0)
        pr_int(n / 10);
    putchar((n % 10) + '0');
}

如果采访者随后评论说n = -n;对于INT_MIN将失败,那么我将其重写为:

void pr_uint(unsigned int n) {
    if (n / 10 != 0)
        pr_uint(n / 10);
    putchar((n % 10) + '0');
}

void pr_int(int n) {
    if (n < 0) {
        putchar('-');
        n = -n;
    }
    pr_uint((unsigned int) n);
}

1
投票

考虑使用itoa函数(您需要导入其库),然后遍历它生成的cstring中的每个字符(使用strlen获取该循环的上限),然后在每个字符上简单地使用putchar()。


1
投票

正确回答此问题很大程度上取决于“外部存储”和“仅putchar”的含义。

void print_int_r (int x, int neg) {
    int y = x/10;
    int d = x%10;
    if (y) print_int_r(y, neg);
    putchar('0' + (neg ? -d : d));
}

void print_int (int x) {
    int neg = x < 0;
    if (neg) putchar('-');
    print_int_r(x, neg);
    putchar('\n');
}

上面的实现采用C99语义,如C99第6.5.5节p6中所述:

[除以整数时,/运算符的结果为代数商,其中任何小数部分均被舍弃。如果商a/b是可表示的,则表达式(a/b)*b + a%b应等于a

但是,%的ANSI C(C 89)语义更糟。 ANSI C第3.3.5 p5节说:

[如果任何一个操作数为负,则/运算符的结果是小于代数商的最大整数还是大于代数商的最小整数,由实现定义,[ C0]运算符。

Ferruccio的第二个答案几乎是完美的。问题是转换不正确。如果运算结果是%无法表示的值,则n = -n的结果不确定。因此,转换应采用以下方式:

int

并且该解决方案现在符合所有ISO C标准。可以找到详细信息void pr_int(int n) { if (n < 0) { putchar('-'); pr_uint(-(unsigned int)n); } else pr_uint(n); putchar('\n'); }


0
投票

已经有一个与此类似的问题,我在那里回答了here

仅使用putchar将其转换为程序应该足够容易(例如,执行以下操作:

this.

0
投票

我刚刚组装了一些令人恐惧的东西。它主要是概念验证,它非常令人恐惧,仅适用于正整数,但几乎不使用任何存储空间。啊,整数也不能太大,也可能是越野车。while(buf[i]) putc(buf[i++]); putc('\n');

#include <stdio.h>
#include <assert.h>

int main()
{
    const int max_precision = 100000;
    int b = 7414;
    int max = b * max_precision;

    assert(b > 0);

    while (b <= max && b >= 0)
    {
        putchar('0' + (b / max_precision) % 10);
        b *= 10;
    }

    putchar('\n');
}
设置要打印的位数。 max_precision存储实际数字,b用于终止循环(该循环或整数溢出)。
© www.soinside.com 2019 - 2024. All rights reserved.