如何仅在putchar()
的帮助下打印整数。我想做到这一点而无需使用外部存储。去年的一次采访中问了这个问题。
在面试中遇到含糊的要求时,表达您的假设是个好主意。
我将只能使用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);
}
考虑使用itoa函数(您需要导入其库),然后遍历它生成的cstring中的每个字符(使用strlen获取该循环的上限),然后在每个字符上简单地使用putchar()。
正确回答此问题很大程度上取决于“外部存储”和“仅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');
}
。
我刚刚组装了一些令人恐惧的东西。它主要是概念验证,它非常令人恐惧,仅适用于正整数,但几乎不使用任何存储空间。啊,整数也不能太大,也可能是越野车。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
用于终止循环(该循环或整数溢出)。