> 백엔드 개발 > C++ > C 및 C에서 strtol을 사용할 때 오류를 올바르게 처리하려면 어떻게 해야 합니까?

C 및 C에서 strtol을 사용할 때 오류를 올바르게 처리하려면 어떻게 해야 합니까?

Barbara Streisand
풀어 주다: 2024-12-25 15:35:09
원래의
925명이 탐색했습니다.

How Can I Properly Handle Errors When Using strtol in C and C  ?

오류 처리와 함께 strtol의 올바른 사용법

다음 C 또는 C 프로그램은 strtol이 반환한다는 사실에 의존하여 문자열을 긴 정수로 변환합니다. 성공적인 변환의 경우 NULL입니다. 그러나 값이 55인 경우 다음 메시지와 함께 실패합니다.

./convertToLong 55
Could not convert 55 to long and leftover string is: 55 as long is 55
로그인 후 복사

이 문서에서는 strtol의 오류를 올바르게 감지하고 해당 프로그램의 문제를 해결하는 방법을 설명합니다.

strtol의 오류 처리

strtol(및 strtoll과 같은 관련 기능)의 공식 사양에는 다음과 같은 내용이 나와 있습니다. that:

  • 입력 문자열을 공백, 제목(정수), 인식할 수 없는 문자의 세 부분으로 나눕니다.
  • 제목이 비어 있거나 유효하지 않은 경우 변환이 발생하지 않으며, endptr은 입력 문자열의 시작 부분을 가리킵니다.
  • 변환된 값이 표현 가능한 범위를 벗어나면 적절한 최소값 또는 최대값을 반환합니다. (예: LONG_MIN 또는 LONG_MAX), errno는 ERANGE로 설정됩니다.

프로그램 수정

C에서는 설정을 통해 strtol의 오류를 감지할 수 있습니다. 함수를 호출하기 전에 errno를 0으로 설정하세요. 아래의 수정된 parsLong 함수는 다음 접근 방식을 따릅니다.

static long parseLong(const char *str)
{
    errno = 0;
    char *temp;
    long val = strtol(str, &temp, 0);

    if (temp == str || *temp != '<pre class="brush:php;toolbar:false">bool parseLong(const char *str, long *val)
{
    char *temp;
    bool rc = true;
    errno = 0;
    *val = strtol(str, &amp;temp, 0);

    if (temp == str || *temp != '' ||
        ((*val == LONG_MIN || *val == LONG_MAX) &amp;&amp; errno == ERANGE))
        rc = false;

    return rc;
}
로그인 후 복사
' || ((val == LONG_MIN || val == LONG_MAX) && errno == ERANGE)) fprintf(stderr, "Could not convert '%s' to long and leftover string is: '%s'\n", str, temp); // cerr << "Could not convert '" << str << "' to long and leftover string is '" // << temp << "'\n"; return val; }
  • 입력이 비어 있거나 유효하지 않거나 후행 문자가 있는 경우 stderr에 오류를 인쇄하고 오류가 있는 경우 0 또는 LONG_MIN/LONG_MAX를 반환합니다. 범위 오버플로로 인해 발생했습니다.
  • 오류가 없으면 변환된 값을 반환합니다. value.

C에서 보다 유연한 접근 방식은 성공/실패 표시기를 반환하고 변환된 값을 추출하기 위한 별도의 함수를 제공하는 것입니다.

결론

이러한 수정을 통해 parsLong 함수는 strtol의 오류를 올바르게 처리하여 애플리케이션이 성공 여부를 판단할 수 있습니다. 또는 변환 실패를 확인하고 오류를 적절하게 처리하세요.

위 내용은 C 및 C에서 strtol을 사용할 때 오류를 올바르게 처리하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿