⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 strtoul.c

📁 一组基础的C库的实现
💻 C
字号:
/* $Id: strtoul.c 262 2006-11-16 07:34:57Z solar $ *//* Release $Name$ *//* strtoul( const char *, char * *, int )   This file is part of the Public Domain C Library (PDCLib).   Permission is granted to use, modify, and / or redistribute at will.*/#include <limits.h>#include <stdlib.h>#ifndef REGTEST#include <stdint.h>unsigned long int strtoul( const char * s, char ** endptr, int base ){    unsigned long int rc;    char sign = '+';    const char * p = _PDCLIB_strtox_prelim( s, &sign, &base );    if ( base < 2 || base > 36 ) return 0;    rc = _PDCLIB_strtox_main( &p, (unsigned)base, (uintmax_t)ULONG_MAX, (uintmax_t)( ULONG_MAX / base ), (uintmax_t)( ULONG_MAX % base ), &sign );    if ( endptr != NULL ) *endptr = ( p != NULL ) ? (char *) p : (char *) s;    return ( sign == '+' ) ? rc : -rc;}#endif#ifdef TEST#include <_PDCLIB_test.h>#include <errno.h>int main(){    char * endptr;    /* this, to base 36, overflows even a 256 bit integer */    char overflow[] = "-ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ_";    BEGIN_TESTS;    errno = 0;    /* basic functionality */    TESTCASE( strtoul( "123", NULL, 10 ) == 123 );    /* proper detecting of default base 10 */    TESTCASE( strtoul( "123", NULL, 0 ) == 123 );    /* proper functioning to smaller base */    TESTCASE( strtoul( "14", NULL, 8 ) == 12 );    /* proper autodetecting of octal */    TESTCASE( strtoul( "014", NULL, 0 ) == 12 );    /* proper autodetecting of hexadecimal, lowercase 'x' */    TESTCASE( strtoul( "0xFF", NULL, 0 ) == 255 );    /* proper autodetecting of hexadecimal, uppercase 'X' */    TESTCASE( strtoul( "0XFF", NULL, 0 ) == 255 );    /* errno should still be 0 */    TESTCASE( errno == 0 );    /* overflowing subject sequence must still return proper endptr */    TESTCASE( strtoul( overflow, &endptr, 36 ) == ULONG_MAX );    TESTCASE( errno == ERANGE );    TESTCASE( ( endptr - overflow ) == 53 );    /* same for positive */    errno = 0;    TESTCASE( strtoul( overflow + 1, &endptr, 36 ) == ULONG_MAX );    TESTCASE( errno == ERANGE );    TESTCASE( ( endptr - overflow ) == 53 );    /* testing skipping of leading whitespace */    TESTCASE( strtoul( " \n\v\t\f123", NULL, 0 ) == 123 );    /* testing conversion failure */    TESTCASE( strtoul( overflow, &endptr, 10 ) == 0 );    TESTCASE( endptr == overflow );    endptr = NULL;    TESTCASE( strtoul( overflow, &endptr, 0 ) == 0 );    TESTCASE( endptr == overflow );    return TEST_RESULTS;}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -