2017-12-07 21 views
1

<stdlib.h>이 포함 된 경우 다음 코드는 123.34의 출력을 제공합니다.stdlib.h의 변경 사항과 관련하여 strtof()의이 동작이 왜 변경됩니까?

#include<stdlib.h> 
int main() 
{ 
    char *str="123.34"; 
    float f= strtof(str,NULL); 
    printf("%f",f); 
} 

그러나 <stdlib.h>이 없으면 33.000000의 출력을 생성합니다.

여기서 <stdlib.h>의 역할은 무엇이며 왜 코드에없는 경우 33.00000 값이 발생 했습니까?

+0

lib 헤더를 포함하여 내 PC에서 123.34996을 얻고 있습니다. –

답변

3

컴파일러에서 생성 된 경고를 확인해야합니다.

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

이 여전히 헤더를 포함하지 않고, 기본이 int로 간주되는 반면, 예상되는 반환 형식이 float 때문에 어떤 식 으로든 결정하지 결과를 얻을 수 있습니다. 당신이 stdlib header file로 보면

, 우리는이 선언을 제공, #include<stdlib.h>

float strtof(const char *restrict, char **restrict); 

선언이있다. 놓친 경우 컴파일러는 int을 반환한다고 가정하므로 결과가 결정적이지 않습니다. 필자의 시스템에서는 출력으로 0.00000000을 생성했지만 필요한 흠도에서는 123.339996을 출력으로 사용했습니다.

예방을 위해 항상 -Wall 옵션 (gcc를 사용한다고 가정) 또는 더 나은 경우 -Werror 옵션을 사용하여 코드를 컴파일하는 습관을 만드십시오.

2

<stdlib.h> 헤더는 strtof()float()을 반환한다는 것을 컴파일러에 알립니다. 컴파일러가없는 경우 컴파일러는 int을 반환한다고 가정해야합니다. 최신 C 컴파일러 (GCC 5 이상)는 strtof()에 대한 선언이없고/또는 strtof()에 대한 내부 암기 선언과의 충돌에 대해 불평합니다.

<stdlib.h>을 생략하면 코드를 사용하기 전에 strtof()을 선언하지 않았기 때문에 코드를 C99 및 C11에서 사용할 수 없습니다. <stdio.h>을 생략 했으므로 C90에서 C99 또는 C11은 사용할 수 없습니다. 그들을 사용하기 전에 printf()과 같은 가변 함수를 선언해야합니다.