Форматирование ввода (удаление начальных нулей и десятичных знаков) в ANSI C? - PullRequest
0 голосов
/ 02 февраля 2011
#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
edit Желаемый результат: <1234> (5) Фактический объем производства: 0001234050

Я чувствую, что нахожусь на пороге прозрения, но я попал в контрольно-пропускной пункт, пожалуйста, помогите?

* edit Я забыл упомянуть, что конечный результат, к которому я стремлюсь, состоит в том, чтобы заключить в <1234> недесятичные числа и десятичные числа в скобках (5)

Ответы [ 3 ]

3 голосов
/ 03 февраля 2011

Несколько вещей:

  • Для начала вы звоните intVal() на prev, что будет делать всякие сумасшедшие вещи.
  • У вас нет обработки для '.'.
  • int не может хранить значения с дробными частями.
  • Вы печатаете полное число на каждой итерации.
  • Вы не инициализируете prev в 0.
0 голосов
/ 26 марта 2011

Ваша функция intVal является абсолютно неправильной согласно вашему требованию.

Если вы хотите получить <1234>(5) из 0001234.5, самый простой способ - использовать scanf:

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

см. man scanf

0 голосов
/ 03 февраля 2011

Попробуйте (без оценки знака и обработки ошибок):

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