2013-06-26 5 views
2

strtol은 주어진 문자열에서 긴 정수를 파싱합니다. 괜찮아. 하지만 파싱 된 것이 있는지 어떻게 확인할 수 있습니까? 그래서
abcdef strtol이 전혀 구문 분석하지 않았는지 어떻게 확인할 수 있습니까?

: 너무 다음 문자열 수율 0strtol를 사용하지만
0abcdef

  • :

    • 다음 문자열 수율 0strtol를 사용 : 예를 들어

      , 나는 어떤 지시자도 가지고 있지 않다. f unment는 유효한 0을 파싱했거나 전혀 구문 분석하지 않았으므로 0을 반환합니다.

      strtol이 올바르게 작동했는지 또는 오류와 함께 반환되었는지 어떻게 확인합니까? 대안이 있습니까?

      I read that strtol sets an errno (유닉스), 특히 Win32 플랫폼에 관심이 있습니다.

  • 답변

    3

    :

    long int strtol(const char *nptr, char **endptr, int base); 
    

    endptr이 NULL이 아닌 경우, strtol() 저장 *endptr에서 첫 번째 잘못된 문자의 주소를 입력합니다. 따라서 *endptrnptr을 간단하게 비교할 수 있습니다. 다른 경우 strtol()*endptr 앞에있는 문자를 구문 분석했습니다.

    +0

    이렇게 간단합니다. 감사. – eckes

    +0

    환영합니다 @eckes – nouney

    +0

    첫 번째 잘못된 문자는 아닙니다. 예를 들어 공백의 초기 시퀀스가 ​​유효하지만 문자열이 공백으로 시작하는 경우에도 변환이 수행되지 않으면 'nptr '는'* endptr'에 저장 될 것입니다. – caf

    1

    strtol의 두 번째 매개 변수는 char **입니다. 첫 번째 잘못된 char : take a look at this manpage으로 채워집니다.

    예 :

    strtol 함수의 서명()의
    #include <stdlib.h> 
    int main() 
    { 
        char  *ptr = 0; 
        const char *str = "1234abcd"; 
    
        printf("%d\n", strtol(str, &ptr, 10)); // -> 0 
        printf("ptr: %c\n", *ptr); // -> 'a' 
        while (*str && *str != *ptr) 
        { 
         printf("parsed: %c\n", *str); // -> '1' '2' '3' & '4' 
         ++str; 
        } 
        return 0; 
    } 
    
    관련 문제