C 언어 strtod()함수 사례 상세 설명

4520 단어 C 언어strtod()
머리말
인터넷 에는 strtod()함수 에 관 한 글 이 많 지만 대부분 strtod()함수 로 문 자 를 변환 합 니 다.

char *str = "111.11";
char *target;
double ret;
ret = strtod(str, &target);
문자열 을 바 꾸 는 이런 용법 은 드물다

char *p = "111.11 -2.22 Nan nan(2) inF 0X1.BC70A3D70A3D7P+6  1.18973e+4932zzz";
본 고 는 주로 strtod()함 수 를 참고 하여 그 중의 코드 예 시 를 설명 할 뿐 입 니 다.물론 저 는 예시 코드 를 이해 할 때 약간의 문제 가 생 겼 습 니 다.StackOverflow 에서 다음 과 같은 질문 을 했 습 니 다.그 결과 Barmar 대신 이 코드 를 직접 해석 하여 이 신,StackOverflow 판 링크 에 감 복 했 습 니 다.
코드 분석

#include <stdio.h>
#include <errno.h>
#include <stdlib.h>

int main(void)
{
    // parsing with error handling
    const char *p = "111.11 -2.22 Nan nan(2) inF 0X1.BC70A3D70A3D7P+6  1.18973e+4932zzz";
    printf("Parsing '%s':
", p); char *end; for (double f = strtod(p, &end); p != end; f = strtod(p, &end)) { printf("'%.*s' -> ", (int)(end-p), p); p = end; if (errno == ERANGE){ printf("range error, got "); errno = 0; } printf("%f
", f); } // parsing without error handling printf("\" -0.0000000123junk\" --> %g
", strtod(" -0.0000000123junk", NULL)); printf("\"junk\" --> %g
", strtod("junk", NULL)); }
질문 1:

p = end //          ?
strtod()함수 의 인자:

double      strtod( const char          *str, char          **str_end );
str   s t r 가 가리 키 는 문자열 의 지침
end_str   e n d _ 포인터
strtod()함수 가 호출 되 지 않 기 전에 문자열 포인터 p 와 end 주 소 를 인쇄 합 니 다.

printf("%p
", p); printf("%p
", end);
실행 결과
0000000000408000 000000000000002D
다음 순환 을 실행 할 때 p 와 end 주 소 를 인쇄 합 니 다.

for (f = strtod(p, &end); p != end; f = strtod(p, &end))
     {
        printf("p addr = %p
", p); printf("end addr = %p
", end); printf("'%.*s' -> ", (int)(end-p), p); p = end; if (errno == ERANGE){ printf("range error, got "); errno = 0; } //printf("%f
", f); }
출력
p addr = 0000000000408000
end addr = 0000000000408006
'111.11' -> 111.110000
p addr = 0000000000408006
end addr = 000000000040800C
' -2.22' -> -2.220000
p addr = 000000000040800C
end addr = 0000000000408010
' Nan' -> 1.#QNAN0
p addr = 0000000000408010
end addr = 0000000000408017
' nan(2)' -> 1.#SNAN0
p addr = 0000000000408017
end addr = 000000000040801B
' inF' -> 1.#INF00
p addr = 000000000040801B
end addr = 0000000000408030
' 0X1.BC70A3D70A3D7P+6' -> 111.110000
p addr = 0000000000408030
end 포인터 가 현재 문자열 의 다음 문 자 를 가리 키 는 것 을 발견 할 수 있 습 니 다.p 포인 터 는 현재 문자열 의 한 문 자 를 가리 키 고 있 습 니 다.
这里写图片描述
따라서 p=end 라 는 문 구 는 문자열 의 모든 문 자 를 strtod()로 조작 하고 for(f=strtod(p,&end)로 사용 합 니 다.p != end; f=strtod(p,&end)문장의 p=end 는 strtod()작업 을 해 야 할 문자 가 없 으 면 순환 을 종료 할 수 있 습 니 다.
질문 2:

printf("'%.*s' -> ", (int)(end-p), p);
인쇄 된 문 자 는 왜 일련의 문자 입 니까?예 를 들 어:
'111.11' ' -2.22' ' Nan' ' nan(2)' ' inF' ' 0X1.BC70A3D70A3D7P+6' ' 1.18973e+4932'
(int)(end-p)길 이 를 계산 합 니 다.%.*s 의*길 이 는 현재 문자열 에서 몇 개의 문 자 를 선택 하여 인쇄 하 는 것 입 니까?
예제 코드:

#include<stdio.h>

int main ()
{
    char *p = "Hello World!";
    printf("length = 2 str = %.2s
", p); printf("length = 3 str = %.3s
", p); }
출력
length = 2 str = He
length = 3 str = Hel
여기 서 C 언어 strtod()함수 사례 에 대한 상세 한 설명 은 여기까지 입 니 다.더 많은 C 언어 strtod()함수 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기