> 백엔드 개발 > C++ > C에서 strtol을 사용하여 문자열을 긴 정수로 변환할 때 오류를 안정적으로 감지하려면 어떻게 해야 합니까?

C에서 strtol을 사용하여 문자열을 긴 정수로 변환할 때 오류를 안정적으로 감지하려면 어떻게 해야 합니까?

Linda Hamilton
풀어 주다: 2024-12-14 20:36:16
원래의
562명이 탐색했습니다.

How Can I Reliably Detect Errors When Converting Strings to Long Integers Using strtol in C?

strtol을 사용하여 문자열을 긴 변환으로 오류 감지

C 프로그래밍에서 strtol 함수는 일반적으로 문자열 표현을 변환하는 데 사용됩니다. 긴 정수를 숫자 값으로 변환합니다. 그러나 strtol만 사용하면 항상 충분한 오류 처리가 제공되지 않을 수 있습니다.

문제:

제공된 코드는 프로그램이 문자열을 긴 정수로 올바르게 변환하는 시나리오를 보여줍니다. , 성공적인 변환에도 불구하고 "변환할 수 없습니다"라는 오류 메시지도 인쇄합니다. 이는 프로그램이 strtol이 문자열을 성공적으로 변환하면 두 번째 매개변수(남은 문자열을 나타냄)가 NULL이어야 한다고 가정하기 때문입니다. 그러나 특정 조건에서는 성공적인 변환에도 불구하고 NULL이 아닌 남은 문자열이 발생할 수 있습니다.

해결책:

strtol에서 오류를 정확하게 감지하려면 다음 개선 사항을 고려하십시오.

  1. 전용 함수를 사용하여 strtol을 호출합니다. 이를 통해 코드가 향상됩니다. 구성 및 가독성.
  2. 여러 오류 조건 확인: strtol 오류 처리가 복잡합니다. 남은 항목 외에도 잘못된 숫자 문자열, 숫자 오버플로 및 선행/후행 공백도 확인해야 합니다.
  3. strtol을 호출하기 전에 명시적으로 errno를 0으로 설정합니다. 이렇게 하면 errno가 올바르게 지정되었는지 확인할 수 있습니다. 발생한 오류를 나타내도록 설정합니다.
  4. 특정 오류 값을 확인하세요. 오류가 발생하면 ERANGE(숫자 오버플로)와 관련된 errno 값을 확인하세요.

수정된 함수:

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

    if (temp == str || *temp != '<pre class="brush:php;toolbar:false">if (parseLong(str, &value))
    // Conversion successful
else
    // Handle error
로그인 후 복사
' || ((*val == LONG_MIN || *val == LONG_MAX) && errno == ERANGE)) rc = false; return rc; }

사용법:

이 수정된 함수는 변환이 성공했는지 나타내는 부울 값을 반환합니다. 아니면. 다음과 같이 사용할 수 있습니다.

추가 참고 사항:

  • 공백 자르기를 처리하거나 다음으로 변환을 제한하도록 함수를 추가로 사용자 정의할 수 있습니다. 10진수 값만 가능합니다.
  • 일부 시나리오에서는 오류 코드 반환 또는 오류 발생과 같은 보다 세부적인 오류 보고 메커니즘이 필요할 수 있습니다. 예외.

위 내용은 C에서 strtol을 사용하여 문자열을 긴 정수로 변환할 때 오류를 안정적으로 감지하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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