2013-12-14 7 views
5

мне нужно пройти двойной к моей программе, но следующий не работает:C: преобразование ARGV [1], чтобы удвоить

int main(int argc, char *argv[]) { 

double ddd; 

ddd=atof(argv[1]); 

printf("%f\n", ddd); 

return 0; 
} 

Если я запускаю свою программу как ./myprog 3.14 она до сих пор печатает 0.000000.

Может ли кто-нибудь помочь?

+0

Были ли у вас какие-либо ошибки/предупреждения от вашего компилятора, когда вы пытались скомпилировать это? –

+0

Вы имели в виду, что он возвращает 0 или печатает 0? Потому что вы сказали ему вернуть 0 на последней строке. – Pyrce

+0

Я уточнил свой вопрос. Спасибо за указание на это. –

ответ

8

Мое предположение вы забыли включить #include <stdlib.h>. Если это так, то gcc выдаст следующее предупреждение:

warning: implicit declaration of function 'atof' [-Wimplicit-function-declaration] 

И дают точный результат вы предоставили: 0.000000.

+0

(Вы пытаетесь сделать некоторые выводы о последствиях низкой репутации? :-)) –

+0

добавление '#include ' решило проблему. Но, как ни странно, 'gcc' не выдавал никаких предупреждений без stdlib.h –

+0

@MartinVegter: Вы уверены, что сказали« gcc -W -Wall -Wextra -pedantic »? –

4

Как указано на карте памяти, вы, вероятно, пренебрегли #include <stdlib.h>. Причина в том, что, не имея декларации atof(), стандарт C указывает, что возвращаемое значение считается int. В этом случае это не int, что означает, что фактическое поведение, которое вы наблюдаете (получение возвращаемого значения 0), технически не указано.

Для того, чтобы быть ясно, без double -returning декларации, линия ddd=atof(argv[1]) трактуется как вызов к int -returning функции, чей результат затем приводится к double. Вполне вероятно, что соглашения о вызовах в конкретной системе, в которой вы находитесь, указывают, что int s и double s получаются в разных регистрах, поэтому 0, скорее всего, будет тем, что оказалось в этом конкретном регистре, а double возвращаемое значение томится, ненаблюдается.

2

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

P.S. atof() и atoi() скрыть ошибки ввода (которые вы всегда можете увидеть, добавив параметр -Wall к вашему вызову gcc-компилятора: gcc -Wall test.c), поэтому большинство людей предпочитают вместо этого использовать strtol() и strtod().

Смежные вопросы