如何仅在putchar
的帮助下打印整数。我想在不使用外部存储的情况下这样做
去年在一次采访中提到了这个问题。
答案 0 :(得分: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 :(得分:1)
考虑使用itoa函数(你需要导入它的库),然后遍历它生成的cstring中的每个字符(使用strlen来获取这个循环的上限)然后简单地在每个字符上使用putchar()。 / p>
答案 2 :(得分: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说:
如果任一操作数为负,则
/
运算符的结果是小于代数商的最大整数还是大于代数商的最小整数是实现定义的,结果的符号也是如此%
运算符。
Ferruccio的第二个答案几乎是完美的。问题是转换不对。如果操作的结果是n = -n
无法表示的值,则int
的结果是未定义的。所以,转换应该这样做:
void pr_int(int n) {
if (n < 0) {
putchar('-');
pr_uint(-(unsigned int)n);
} else
pr_uint(n);
putchar('\n');
}
现在解决方案符合所有ISO C标准。可以找到详细信息here。
答案 3 :(得分:0)
答案 4 :(得分:0)
我刚收集了一些可怕的东西。它主要是概念验证,它非常可怕,仅适用于正整数,但几乎不使用存储。啊,整数也不能太大,而且它可能是错误的。
#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
存储实际数字,max
用于终止循环(或者整数溢出)。