c语言字符串转数字

这是一个字符串转int的函数(libc 有同类函数strtol系列)

这虽然是个玩具函数,但在设计之初确定了如下目标:

1.函数原型模仿strtol,但是去掉strtol第二个参数

int str2int(char *str, int base); //玩具函数原型

long strtol(const char *restrict str, char **restrict endptr, int base);//libc库函数原型

2.扩展strtol函数(环境为mac libc)的进制猜测能力,当base为0时strtol函数会根据restric的前缀为0x推测为16进制,0为8进制,玩具函数加入0b前缀表示2进制

3.支持2-36之间的进制。例如:z是10进制中的35

4.支持负数

5.测试4个字节所能表示的最大值,最小值,包含2,8,10,16进制

code

#include <stdio.h>
#include <ctype.h>

/*
 * @param base 可以是0或者2-36之间的任意整数
 * 如果是0,函数会自己猜测要转的进制,如果str是以0x开头,等同base为16
 * 如果str是0b开头,等同base为2
 * 如果str是0开头,等同base为8
 */ 
int str2int(char *str, int base) {
    char sign;
    int rv = 0;
    char c;
    int newbase = -1;

    if ((base < 2 && base != 0) || base > 36)
        return 0;

    //跳过str开头的空白字符
    while(*str && isspace(*str))
        str++;

    //取得符号位
    sign = (*str == ‘-‘ || *str == ‘+‘) ? *str++ : ‘+‘;

    //猜测需要转换的类型
    if (*str == ‘0‘ && ++str) {
        if ((*str == ‘x‘ || *str == ‘X‘) && ++str) {
            newbase = 16;
        } else if ((*str == ‘b‘ || *str == ‘B‘) && ++str) {
            newbase = 2;
        } else {
            newbase = 8;
        }
    }

    //默认10进制
    if (base == 0) {
        base = newbase == -1 ? 10 : newbase;
    }

    //printf("base = %d:%s\n", base, str);
    for (;*str; str++) {
        //大写转小写
        c = *str | 0x20;
        if (c >= ‘a‘ && c <= ‘z‘) {
            rv = rv * base + c - ‘a‘ + 10;
        } else if (c >= ‘0‘ && c <= ‘9‘) {
            rv = rv * base + c - ‘0‘;
        } else {
            break;
        }
        //printf("rv = %d\n", rv);
    }
    
    return sign == ‘-‘ ? -rv : rv;
}

#include <stdlib.h>
#include <limits.h>
#include <assert.h>
int main() {

    //test
    //==== max=====
    //2进制
    assert(str2int("0b11111111111111111111111111111111", 0) == 0xFFFFFFFF);
    printf("2 max:%x\n", str2int("0b11111111111111111111111111111111", 0));
    printf("2 max:%x\n", str2int("0b11111111111111111111111111111111", 2));

    assert(str2int("0777777777777", 0) == 0xFFFFFFFF);
    //8进制
    printf("8 max:%x\n", str2int("0777777777777", 0));
    printf("8 max:%u\n", str2int("0777777777777", 0));
    printf("8 max:%x\n", str2int("0777777777777", 8));
    printf("8 max:%u\n", str2int("0777777777777", 8));

    assert(str2int("4294967295", 0) == 0xFFFFFFFF);
    //10进制
    printf("10 max:%u\n", str2int("4294967295	", 0));
    printf("10 max:%u\n", str2int("4294967295	", 10));

    assert(str2int("0xffffffff", 0) == 0xFFFFFFFF);
    //16进制
    printf("16 max:%x\n", str2int("0xffffffff", 0));
    printf("16 max:%x\n", str2int("0XFFFFFFFf", 0));
    printf("16 max:%x\n", str2int("0xffffffff", 16));
    printf("16 max:%x\n", str2int("0XFFFFFFFf", 16));

    assert(str2int("0b10000000000000000000000000000000", 0) == 0x80000000);
    //=====min=====
    //2进制
    printf("2 min:%x\n", str2int("0b10000000000000000000000000000000", 0));
    printf("2 min:%x\n", str2int("0b10000000000000000000000000000000", 2));
    printf("2 min:%d\n", str2int("0b10000000000000000000000000000000", 0));
    printf("2 min:%d\n", str2int("0b10000000000000000000000000000000", 2));

    assert(str2int("020000000000", 0) == 0x80000000);
    //8进制
    printf("8 min:%d\n", str2int("020000000000", 8));
    printf("8 min:%d\n", str2int("020000000000", 0));
    printf("8 min:%x\n", str2int("020000000000", 8));
    printf("8 min:%x\n", str2int("020000000000", 8));

    //10进制
    printf("10 min:%d\n", str2int("-2147483648", 10));
    printf("10 min:%x\n", str2int("-2147483648", 10));

    //16进制
    printf("16 min:%d\n", str2int("0x80000000", 16));
    printf("16 min:%x\n", str2int("0x80000000", 16));

    //printf("%x", strtoul("-2147483648", NULL, ));
    //35进制
    printf("35:%d\n", str2int("z", 35));
    return 0;
}
时间: 2024-10-10 00:21:10

c语言字符串转数字的相关文章

C语言 字符串和数字转换函数

atof(将字符串转换成浮点型数) 相关函数 atoi,atol,strtod,strtol,strtoul 表头文件 #include <stdlib.h> 定义函数 double atof(const char *nptr); 函数说明 atof()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回.参数nptr字符串可包含正负号.小数点或E(e)来表示指数部分,如123.456或123e-2.

C语言中将字符串转换为数字的方法

C语言提供了几个标准库函数,可以将字符串转换为任意类型(整型.长整型.浮点型等)的数字.以下是用atoi()函数将字符串转换为整数的一个例子: # include <stdio. h># include <stdlib. h>void main (void) ;void main (void){    int num;    char * str = "100";    num = atoi(str);    printf("The string 's

C语言字符串操作大全

转载自:C语言字符串操作总结大全(超详细) 1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, p1) 附加字符串 strncat(p, p1, n) 附加指定长度字符串 strlen(p) 取字符串长度 strcmp(p, p1) 比较字符串 strcasecmp忽略大小写比较字符串strncmp(p, p1, n) 比较指定长度字符串 strchr(p, c) 在字符串中查找指定字符 strrchr(p, c)

php 字符串和数字比较一些问题

本文章来给大家介绍关于php 字符串和数字比较一些问题,因为数字与字符在php中是不同的数据类型,所以在比较时可能会有很多的问题. 今天遇到一个问题,调用对方接口,按照接口说明,返回为数字0,1,2等等,其中0标示成功,其他表示不同的错误代码.程序通过 if ($ret == 0) 进行判断,开始程序是好的,今天出现问题了,由于对方接口修改,直接返回字母字符串作为错误信息提示,然后我这边就悲剧了,上述判断永远都为TRUE. 原因在于php是弱类型语言,所以可以对两个不同类型的变量进行比较操作,但

字符串与数字之间的转换

1. itoa itoa是广泛应用的非标准c语言扩展函数,头文件为 #icnlude<stdlib.h> char* itoa(int value,char* string,int radix); #include<iostream> #include<cstdlib> using namespace std; int main(){ int i=15; char str[25]; itoa(i,str,16); cout<<str<<endl;

字符串和数字之间的转换(Unicode)

1 Unicode编码的字符串转换为数字类型 CString str; str = _T("1234"); int i = _ttoi(str); float f = _tstof(str); 2 数字转换为wchar_t wchar_t c[10]; int num = 100; _itow_s(num,c,10,10进制); wstring str(c); 3 wstring 转换为int wstring str; _wtoi(str.c_str); 那么究竟什么是Unicode?

c语言字符串与其他类型的翻译方法

C语言提供了几个标准库函数,可以将任意类型(整型.长整型.浮点型等)的数字转换为字符串. 1.int/float to string/array: C语言提供了几个标准库函数,可以将任意类型(整型.长整型.浮点型等)的数字转换为字符串,下面列举了各函数的方法及其说明.● itoa():将整型值转换为字符串.● ltoa():将长整型值转换为字符串.● ultoa():将无符号长整型值转换为字符串.● gcvt():将浮点型数转换为字符串,取四舍五入.● ecvt():将双精度浮点型值转换为字符串

Python字符串拼接(包含字符串拼接数字)

在 Python 中拼接(连接)字符串很简单,可以直接将两个字符串紧挨着写在一起,具体格式为: strname = "str1" "str2" strname 表示拼接以后的字符串变量名,str1 和 str2 是要拼接的字符串内容.使用这种写法,Python 会自动将两个字符串拼接在一起.https://www.furuihua.cn/shenzhen/ [示例]以连续书写的形式拼接字符串: str1 = "Python教程" "ht

10天精通Sass 之 处理字符串与数字的函数

Sass的函数简介 Sass中自备了一系列的功能函数,包括: - 字符串函数 - 数字函数 - 列表函数 - 颜色函数 - Introspection函数 - 三元函数 除了Sass中已提供的函数,我们还可以根据自己的需求定义函数,称为自定义函数. 字符串函数 * unquote($string) * :删除字符串中的引号 * quote($string) * :给字符串加引号 unquote()函数 用来删除字符串的引号,如果这个字符串没有引号,则返回原始字符串. .test1 { conte