天天看点

C语言中的strtol函数

1.定义

#include <stdlib.h>
long int strtol(const char * restrict nptr,char ** restrict endptr,int base);
/*base:表示进制比如10-->10进制、2-->2进制、16-->16进制*/
/*功能:将字符形式的数字nptr按照进制base转换为long int型的整数*/
/*(**endptr):指向指针的指针==指向一个位置的指针==指向结束转换位置的指针*/
           

2.程序实例

/*一开始strtol()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上
数字或正负符号才开始做转换,再遇到非数字或字符串结束符('\0')结束转
换,并将转换数值返回*/
/*参数endptr指向停止转换的位置,若字符串nptr的所有字符都成功转换成
数字则endptr指向串结束符'\0'。判断是否转换成功,应检查**endptr是否
为'\0'*/
#include <stdio.h>
#include <stdlib.h>
#define LIM 30

char *s_gets(char *s, int n);

int main()
{
    char number[LIM];
    char *end;

    long value;
    puts("Enter a number(empty line to quit)");
    while (s_gets(number, LIM) && number[0] != '\0')
    {
        value = strtol(number, &end, 10);
   /*也即&end是一个指向停止转换位置的指针---指向指针的指针,
   所以end本身是一个表示一个位置,再次解引用的值就是停止转
   换处字符的ASCII码(重要!!)*/
        printf("base 10 input,base 10 output:%ld,stopped at %s(%d)\n",
               value, end, *end);
        value = strtol(number, &end, 16);
        printf("base 16 input,base 10 output :%ld,stopped at %s(%d)\n",
               value, end, *end);
        puts("NEXT number!");
    }
    puts("Bye!");

    return 0;
}

char *s_gets(char *s, int n)
{
    char *ret_val;
    int i = 0;
    ret_val = fgets(s, n, stdin); //fgets正常情况下返回的地址与第一个输入参数相同
    if (ret_val != NULL)
    {
        while (s[i] != '\n' && s[i] != '\0')
        {
            i++;
        }
        if (s[i] == '\n')
        {
            s[i] = '\0';
        }
        else
        {
            while (getchar() != '\n')
            {
                continue;
            }
        }
    }
    return ret_val;
}
           
输入10和10bank的不同结果如下:
10
base 10 input,base 10 output:10,stopped at (0)
base 16 input,base 10 output :16,stopped at (0)
NEXT number!
10bank
base 10 input,base 10 output:10,stopped at bank(98)
base 16 input,base 10 output :4282,stopped at nk(110)
NEXT number!
***********************************************
其中98是字母b的ASCII码、110是字母n的ASCII码。
           

继续阅读