Язык программирования Си (Ритчи, Керниган) - страница 61

представляет собой расширение функции atoi, две версии которой были рассмотрены в главах 2 и 3. Она имеет дело со знаком (которого может и не быть), с десятичной точкой, а также с целой и дробной частями, одна из которых может отсутствовать. Наша версия не является высококачественной программой преобразования вводимых чисел; такая программа потребовала бы заметно больше памяти. Функция atof входит в стандартную библиотеку программ: ее описание содержится в заголовочном файле ‹stdlib.h›.

Прежде всего отметим, что объявлять тип возвращаемого значения должна сама atof, так как этот тип не есть int. Указатель типа задается перед именем функции.

>#include ‹ctype.h›

>/*atof: преобразование строки s в double */

>double atof (char s[])

>{

> double val, power;

> int i, sign;


> for (i = 0; isspace(s[i]); i++)

>  ; /* игнорирование левых символов-разделителей */

> sign = (s[i] == '-') ? -1 : 1;

> if (s[i] == '+' || s[i] == '-')

>  i++;

> for (val = 0.0; isdigit(s[i]); i++)

>  val = 10.0 * val + (s[i] - '0');

> if (s[i] == '.')

>  i++;

> for (power = 1.0; isdigit(s[i]); i++) {

>  val = 10.0 * val + (s.[i] - '0');

>  power *= 10.0;

> }

> return sign * val / power;

>}

Кроме того, важно, чтобы вызывающая программа знала, что atof возвращает нецелое значение. Один из способов обеспечить это - явно описать atof в вызывающей программе. Подобное описание демонстрируется ниже в программе простенького калькулятора (достаточного для проверки баланса чековой книжки), который каждую вводимую строку воспринимает как число, прибавляет его к текущей сумме и печатает ее новое значение.

>#include ‹stdio.h›

>#define MAXLINE 100

>/* примитивный калькулятор */

>main()

>{

> double sum, atof (char[]);

> char line[MAXLINE];

> int getline (char line[], int max);


> sum = 0;

> while (getline(line, MAXLINE) › 0)

>  printf ("\t%g\n", sum += atof(line));

> return 0;

>}

В объявлении

>double sum, atof (char[]);

говорится, что sum - переменная типа double, a atof - функция, которая принимает один аргумент типа char[] и возвращает результат типа double.

Объявление и определение функции atof должны соответствовать друг другу. Если в одном исходном файле сама функция atof и обращение к ней в main имеют разные типы, то это несоответствие будет зафиксировано компилятором как ошибка. Но если функция atof была скомпилирована отдельно (что более вероятно), то несоответствие типов не будет обнаружено, и atof возвратит значение типа double, которое функция main воспримет как int, что приведет к бессмысленному результату.

Это последнее утверждение, вероятно, вызовет у вас удивление, поскольку ранее говорилось о необходимости соответствия объявлений и определений. Причина несоответствия, возможно, будет следствием того, что вообще отсутствует прототип функции, и функция неявно объявляется при первом своем появлении в выражении, как, например, в