如何仅借助putchar()打印整数。我想在不使用外部存储的情况下这样做。
这个问题是在去年的一次采访中提出的。
发布于 2012-08-16 03:36:38
当在面试中面对模糊的要求时,表达你的假设是一个好主意。
我认为只能使用putchar的要求意味着它是我唯一被允许调用的库函数。此外,我还假设“没有外部存储”意味着我不能显式地创建缓冲区。如果面试官同意我的假设,我会继续:
void pr_int(int n) {
if (n < 0) {
putchar('-');
n = -n;
}
if (n / 10 != 0)
pr_int(n / 10);
putchar((n % 10) + '0');
}如果面试官随后评论说,INT_MIN的n = -n;将失败,如下所示,那么我将重写为:
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);
}发布于 2012-08-16 03:27:59
考虑使用itoa函数(您需要导入它的库),然后遍历它生成的cstring中的每个字符(使用strlen获得这个循环的上限),然后简单地对每个字符使用putchar()。
发布于 2012-08-16 04:43:42
正确回答这个问题在很大程度上取决于什么是“外部存储”和“仅限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 (C89)语义更差。ANSI C第3.3.5节p5规定:
如果任一操作数为负,则
/运算符的结果是小于代数商的最大整数还是大于代数商的最小整数是由实现定义的,与%运算符的结果的符号相同。
费鲁乔的第二个答案几乎是完美的。问题是转换是不正确的。如果操作的结果是一个不可由int表示的值,则n = -n的结果是未定义的。因此,转换应该这样完成:
void pr_int(int n) {
if (n < 0) {
putchar('-');
pr_uint(-(unsigned int)n);
} else
pr_uint(n);
putchar('\n');
}该解决方案现在符合所有ISO C标准。详情可以在here上找到。
https://stackoverflow.com/questions/11975780
复制相似问题