跳至主要內容

字符串转不同进制数学

张威大约 1 分钟使用指南页面配置使用指南

strtol()函数字符串转换成十进制、十六进制 、二进制、 八进制 long类型

#include <stdlib.h>
long int strtol (const char* str, char** endptr, int base);

str 为要转换的字符串,endstr 为第一个不能转换的字符的指针,base 为字符串 str 所采用的进制。

参数 base 范围从2 至36,或0。

strtol() 会扫描参数 str 字符串,跳过前面的空白字符(例如空格,tab缩进等,可以通过 isspace() 函数来检测),直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串结束时(’\0’)结束转换,并将结果返回。

#include <iostream>
#include <string>

int main() {
	
	char szNumbers[] = "2001 60c0c0 -1101110100110100100000 0x6fffff";
	char * pEnd;
	long int li1, li2, li3, li4;
	li1 = strtol(szNumbers, &pEnd, 10);	//用十进制   解析2001
	li2 = strtol(pEnd, &pEnd, 16);		//用十六进制 解析60c0c0
	li3 = strtol(pEnd, &pEnd, 2);		//用二进制   解析-1101110100110100100000
	li4 = strtol(pEnd, NULL, 0);		//自动判断   解析0x6fffff
	
	printf("转换成10进制: %ld%ld%ld%ld\n", li1, li2, li3, li4);	//转换成10进制: 2001、6340800、-3624224、7340031

	return 0;
}
#获取8进制参数
#include <iostream>
#include <cstdlib>
#include <unistd.h>
#include <cstdio>
//#include <cstring>
//./my_mkdir new_directory 0777 #依然会受到umask的影响
int main(int argc, char** argv) {
    if(argc != 3) {
        std::cout << "Args Error!" << std::endl;
        return -1;
    }
	mode_t mode = strtol(argv[2], nullptr, 8); //字符串转8进制长整型数字
    int ret = mkdir(argv[1], mode);
    if(-1 == ret) {
        //std::cout << "mkdir :" << strerror(ret) << std::endl;
    	perror("mkdir");
    }
}

atoi这个只能字符串转十进制