在ANSI C中格式化输入(删除前导零和小数位)?

时间:2011-02-02 20:57:46

标签: c int string-formatting ansi

#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;
}

我想用这个程序做的是输入一个任意数字,一次读取一个char,然后将其格式化为int,以便我可以使用它(不想使用printf格式化)另外,我只允许使用getchar和printf进行此分配。

样本输入:0001234.5
编辑所需输出:&lt; 1234&gt;(5) 实际产出:0001234050

我觉得我正处于一种顿悟的尖端,但我遇到了障碍,请帮忙吗?

*编辑我忘了提到我要使用的END结果是将&lt; 1234&gt;中包含的非十进制数字包含在内。括号(5)中的十进制数字

3 个答案:

答案 0 :(得分:3)

一些事情:

  • 首先,您在intVal()上拨打prev,这将会做各种疯狂的事情。
  • 您无法处理'.'
  • int无法存储带小数部分的值。
  • 您将在每次迭代时打印出整个数字。
  • 您尚未将prev初始化为0

答案 1 :(得分:0)

尝试一下(没有符号评估和错误处理):

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;
}

答案 2 :(得分:0)

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

如果您想从<1234>(5)获取0001234.5,最简单的方法是使用scanf

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

请参阅man scanf