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()函数
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;
}
头文件< 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() 系列函数来执行。该系列函数的成员可以将字符串转换为 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
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);
头文件< stdio.h >中
#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
【参数】
示例
产生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