首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >putchar()可以打印整数吗?

putchar()可以打印整数吗?
EN

Stack Overflow用户
提问于 2012-08-16 03:22:21
回答 5查看 12.5K关注 0票数 1

如何仅借助putchar()打印整数。我想在不使用外部存储的情况下这样做。

这个问题是在去年的一次采访中提出的。

EN

回答 5

Stack Overflow用户

发布于 2012-08-16 03:36:38

当在面试中面对模糊的要求时,表达你的假设是一个好主意。

我认为只能使用putchar的要求意味着它是我唯一被允许调用的库函数。此外,我还假设“没有外部存储”意味着我不能显式地创建缓冲区。如果面试官同意我的假设,我会继续:

代码语言:javascript
复制
void pr_int(int n) {
    if (n < 0) {
        putchar('-');
        n = -n;
    }
    if (n / 10 != 0)
        pr_int(n / 10);
    putchar((n % 10) + '0');
}

如果面试官随后评论说,INT_MINn = -n;将失败,如下所示,那么我将重写为:

代码语言:javascript
复制
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);
}
票数 5
EN

Stack Overflow用户

发布于 2012-08-16 03:27:59

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

票数 1
EN

Stack Overflow用户

发布于 2012-08-16 04:43:42

正确回答这个问题在很大程度上取决于什么是“外部存储”和“仅限putchar”。

代码语言:javascript
复制
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的结果是未定义的。因此,转换应该这样完成:

代码语言:javascript
复制
void pr_int(int n) {
    if (n < 0) {
        putchar('-');
        pr_uint(-(unsigned int)n);
    } else
        pr_uint(n);
    putchar('\n');
}

该解决方案现在符合所有ISO C标准。详情可以在here上找到。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11975780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档