【问题标题】:Formatting input (removing leading zeros and decimal places) in C90?在 C90 中格式化输入(删除前导零和小数位)?
【发布时间】:2011-06-20 06:27:35
【问题描述】:
#include <stdio.h>

int intVal(int x)
{
    if(x < '0' || x > '9'){
        return 0;
    }
    else{
        x = x - '0';
        return x;
    }
}

int main(void)
{
    int c, num, prev;

    while((c = getchar()) != EOF){
        num = (intVal(prev) * 10) + intVal(c);
        prev = num;
        printf("%d", num);
    }
    return 0;
}

我想用这个程序做的是输入一个任意数字来一次读取一个字符,然后将它格式化为一个 int 以便我可以使用它(不想使用 printf 格式)另外,我只被允许使用 getchar 和 printf 来完成这项任务。

示例输入:0001234.5
编辑所需输出:(5) 实际输出:0001234050

我感觉自己正处于顿悟的边缘,但我遇到了障碍,请帮忙?

*edit 我忘了提到我想要的 END 结果是在 中包含非十进制数,在括号 (5) 中包含十进制数

【问题讨论】:

  • 如果需要输出是 1234.5,为什么要使用 int 来存储输出?

标签: c int string-formatting c89


【解决方案1】:

一些事情:

  • 首先,您在prev 上调用intVal(),这会做各种疯狂的事情。
  • 您没有处理'.'
  • int 不能存储带有小数部分的值。
  • 每次迭代都会打印出整个数字。
  • 您没有将 prev 初始化为 0

【讨论】:

  • 处理不只是'.'但其他非数字也需要改进。添加零是不够的,还要避免为该字符乘以 10 和/或放弃错误投诉。
【解决方案2】:

试试看(没有符号评估和错误处理):

int main(void)
{
    double x=0,op=0;
    int c;

    while((c = getchar()) != EOF && c!='\n')
      if( c=='.' )
        op++;
      else
      if( op )
        x += (op/=10) * intVal(c);
      else
        x = x*10 + intVal(c);

    printf("%f",x);
    return 0;
}

【讨论】:

  • if(op) 和 op/=10 有什么作用?
  • 他们建议你更仔细地阅读你的教科书。
【解决方案3】:

根据您的要求,您的函数 intVal 完全错误。

如果你想从0001234.5 获取&lt;1234&gt;(5),最简单的方法是使用scanf

sscanf("%d.%d", &a, &b);
printf("<%d>(%d)\n", a, b);

man scanf

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-06
    • 2018-07-02
    • 1970-01-01
    • 2015-08-18
    • 2017-08-10
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多