字符串转数字,数字转字符串

字符串转数字,数字转字符串

  • 实现atoi和atof函数
    • atoi
    • atof
  • 字符串转数字的库函数
    • atoX系列函数
    • stoX() 系列函数
  • 数字转字符串的库函数
    • to_string
    • sprintf

实现atoi和atof函数

atoi

https://leetcode-cn.com/problems/string-to-integer-atoi/solution/san-chong-fang-fa-zheng-chang-bian-li-you-xian-zhu/

int myAtoi(string str) {
        if(str.size()==0) return 0;

        //1.过滤开头空格
        //2.符号位
        //3.判断溢出 sum>INT_MAX/10 || sum==INT_MAX/10&& next>7

        int len=str.length();
        int result=0;
        int i=0;

        //过滤空格
        for(;i<len;i++){
            if(str[i]==' ')
                continue;
            else
                break;
        }
        //全是空格
        if(i==len)    return 0;
        
        //确定符号位
        bool flag=false;
        if(str[i]=='-'){
            flag=true;
            i++;
        }else{
            if(str[i]=='+')
                i++;
        }
        //第一个非空格字符不是一个有效整数字符,返回0,下面的返回包含这种情况
        //if(!(str[i]>='0' && str[i]<='9'))    return 0;

        //没有符号位了,开始转换
        while(i<len && str[i]>='0' && str[i]<='9')
        {
             //溢出判断,先得协商溢出后返回啥
             //*10 和+r都可能导致溢出
             if(result>INT_MAX/10||(result==INT_MAX/10 && str[i]-'0'>7))
             //等价于
             //if(result>(INT_MAX-r)/10)
                 return flag?INT_MIN:INT_MAX;
            
            //能到这里,说明未溢出
            //错误的写法,没有括号的话,先计算result+result*10+str[i],这可能会溢出
            //result=result*10+str[i]-'0';
            //正确的写法,不能忘记括号
            result=result*10+(str[i]-'0');

             i++;
        }
        //结束循环时到字符串结尾?,还是遇到非数字字符呢?
        // if(i==len)
        //     return flag ? -result : result;
        // else 
        //     return 0;
        return flag ? -result : result;
}

atof

字符串函数—atof()函数详解及实现(完整版)

atof()函数

double atof(const char *str );

功 能: 把字符串转换成浮点数
str:要转换的字符串。
返回值:每个函数返回 double 值,此值由将输入字符作为数字解析而生成。 如果该输入无法转换为该类型的值,则返回值为 0.0。
函数说明 : atof()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时(’\0’)才结束转换,并将结果返回,str字符串可包含正负号、小数点或E(e)来表示指数部分。

#include

using namespace std;

//关键点
//1.注意返回值是double
//2.不考虑溢出
//3.考虑科学计数法
double MyAtof(const char* str){
    double result=0.0;
    double d=10.0;
    int count =0;
    //1.检查是否为nullptr
    if(str==nullptr)
        return 0;
    //2.过滤开头的空格
    while(*str==' '||*str=='\t')
        str++;
    //3.记录正负
    bool flag=false;
    if(*str=='-')
        flag=true;
    if(*str=='-'||*str=='+')
        str++;
    //4.开始转换整数部分,若出现非数字字符,则返回0.0
    if(!(*str>='0'&&*str<='9'))
        return result;
    while(*str>='0'&&*str<='9'){
        //这里double类型不考虑溢出?
        result=result*10.0+(*str-'0');
        str++;
    }
    //5.遇到小数点后,开始转换小数部分
    if(*str=='.')//小数点
        str++;
    while(*str>='0'&&*str<='9'){
        result=result+(*str-'0')/d;
        d*=10.0;
        str++;
    }
    //先把符号位加到result上,因为接下来的'e' or 'E'后面需要记录符号位
    result=result*(flag?-1.0:1.0);

    //6.遇到'e' or 'E',表明是科学计数法
    if(*str=='e'||*str=='E'){
        //记录e' or 'E'后面的符号位
        flag=(*++str=='-')?true:false;

        if(*str=='+'||*str=='-')
            str++;
        
        while(*str>='0'&&*str<='9'){
            count=count*10+(*str-'0');
            str++;
        }
        //count为负数,除以10^count
        if(flag==true){
            while(count>0){
                result=result/10;
                count--;
            }
        }
        //count为正数,乘以10^count
        if(flag==false){
            while(count>0){
                result=result*10;
                count--;
            }
        }
    }

    return result;
}

int main()
{
	const char *s1 = "0.123456df";
	const char *s2 = "+123.456";
	const char *s3 = "dfsf";
	const char *s4 = "-12345.6e2";
	const char *s5 = "+12.3e-4";
    
    cout<<"s1= "<<MyAtof(s1)<<endl;
    cout<<"s2= "<<MyAtof(s2)<<endl;
    cout<<"s3= "<<MyAtof(s3)<<endl;
    cout<<"s4= "<<MyAtof(s4)<<endl;
    cout<<"s5= "<<MyAtof(s5)<<endl;
    
    system("pause");
    return 0;
}

字符串转数字的库函数

atoX系列函数

头文件< cstdlib >中

<cstdlib>

http://www.cplusplus.com/reference/cstdlib/

函数 功能
atof Convert string to double (function )
atoi Convert string to integer (function )
atol Convert string to long integer (function )
atoll Convert string to long long integer (function )
strtod Convert string to double (function )
strtof Convert string to float (function )
strtol Convert string to long integer (function )
strtold Convert string to long double (function )
strtoll Convert string to long long integer (function )
strtoul Convert string to unsigned long integer (function )
strtoull Convert string to unsigned long long integer (function )
double atof (const char* str);
int atoi (const char * str);
long int atol ( const char * str );
long long int atoll ( const char * str );

double strtod (const char* str, char** endptr);
float strtof (const char* str, char** endptr);
long int strtol (const char* str, char** endptr, int base);
long double strtold (const char* str, char** endptr);
long long int strtoll (const char* str, char** endptr, int base);
unsigned long int strtoul (const char* str, char** endptr, int base);
unsigned long long int strtoull (const char* str, char** endptr, int base);

stoX() 系列函数

字符串到数字的转换可以通过 stoX() 系列函数来执行。该系列函数的成员可以将字符串转换为 int、long、float 和 double 类型的数字。具体语法如下所示:

头文件< string >中

<string>
int stoi(const strings str, size_t* pos = 0, int base = 10)
long stol(const strings str, size_t* pos = 0, int base = 10)
float stof(const strings str, size_t* pos = 0)
double stod(const strings str, size_t* pos = 0)

第一个形参 str 是一个字符串(例如 “-342” 或 “3.48” 等),它将被转换为恰当的数字形式。

这些函数可以将 str 可能的最长前缀转换为数字,并返回一个整数地址 pos,pos 中保存了 str 无法被转换的第一个字符的索引。

例如,如果试图转换字符串 “-34iseven”,则将成功返回整数 -34,而无法转换的第一个字符的位置 pos 则被设置为 3。
base 形参仅适用于整数转换,指示用于转换的进制。
pos 和 base 形参都是可选的,所以它们可以被忽略。如果 pos 被忽略,则不会存储停止字符的索引。如果 base 被忽略,则默认为十进制。
如果字符串 str 包含一个无效值,例如 “is-34 even?”,则不会进行转换,函数将抛出一个 invalid_argument 异常。

数字转字符串的库函数

来自http://c.biancheng.net/view/1527.html

to_string

C++ 11 提供了若干 to_string(T value) 函数来将 T 类型的数字值转换为字符串形式。
以下是几个 to_string() 函数的列表:

头文件< string >中

<string>

http://www.cplusplus.com/reference/string/to_string/?kw=to_string

string to_string (int val);
string to_string (long val);
string to_string (long long val);
string to_string (unsigned val);
string to_string (unsigned long val);
string to_string (unsigned long long val);
string to_string (float val);
string to_string (double val);
string to_string (long double val);

sprintf

头文件< stdio.h >中

  • sprintf
#include 

sprintf()函数用于将格式化的数据写入字符串,其原型为:

int sprintf(char *str, char * format [, argument, ...]);
【参数】str为要写入的字符串;format为格式化字符串,与printf()函数相同;argument为变量。

除了前两个参数类型固定外,后面可以接任意多个参数。而它的精华,显然就在第二个参数--格式化字符串--上。
printf()sprintf()都使用格式化字符串来指定串的格式,在格式串内部使用一些以“%”开头的格式说明符(format specifications)来占据一个位置,在后边的变参列表中提供相应的变量,
最终函数就会用相应位置的变量来替代那个说明符,产生一个调用者想要的字符串。

【返回值】成功则返回参数str 字符串长度,失败则返回-1,错误原因存于errno 中。

常见的format格式:
    %% 印出百分比符号,不转换。
  %c 整数转成对应的 ASCII 字元。
  %d 整数转成十进位。
  %f 倍精确度数字转成浮点数。
  %o 整数转成八进位。
  %s 整数转成字符串。
  %x 整数转成小写十六进位。
  %X 整数转成大写十六进位。
  %n sscanf(str, "%d%n", &dig, &n)%n表示一共转换了多少位的字符

以下来自https://www.runoob.com/cprogramming/c-function-sprintf.html
【参数】

  • str – 这是指向一个字符数组的指针,该数组存储了 C 字符串。
  • format – 这是字符串,包含了要被写入到字符串 str 的文本。它可以包含嵌入的 format 标签,format 标签可被随后的附加参数中指定的值替换,并按需求进行格式化。format 标签属性是 %[flags][width][.precision][length]specifier,具体讲解如下:
    字符串转数字,数字转字符串_第1张图片
    字符串转数字,数字转字符串_第2张图片
    字符串转数字,数字转字符串_第3张图片
  • 附加参数[, argument, …] – 根据不同的 format 字符串,函数可能需要一系列的附加参数[, argument, …],每个参数包含了一个要被插入的值,替换了 format 参数中指定的每个 % 标签。参数的个数应与 % 标签的个数相同。

示例
产生10个100以内的随机数并输出。

#include
#include
#include
int main(void)
{
    char str[100];
    int offset =0;
    int i=0;
    srand(time(0));  // *随机种子
    for(i = 0;i<10;i++)
    {
        offset+=sprintf(str+offset,"%d,",rand()%100);  // 格式化的数据写入字符串
    }
    str[offset-1]='\n';
    printf(str);
    return 0;
}
运行结果:
74,43,95,95,44,90,70,23,66,84

你可能感兴趣的:(C++基础部分)