atoi源码
❶ 函数解析linuxatoi函数的秘密linuxatoi
Linux atoi函数是一种常见的C/C++内置函数,它可以解析字符串并把它们转换为整型数字。它的 API 风格(应用程序编程接口)主要包括:扰激
int atoi(const char * str);
我们可以通过上面的 API 把一个字符串转换成整数。然而,正如我们所知,atoi() 内部实现的秘密是什么?
要了解 atoi() 函数的实现,我们可以看 Linux 核心源码,这是启棚一种 C 函数,它可以在核心代码库中找到:
// atoi 函数定义
int atoi(const char * str)
{
int v;
char *endptr ;
// 初始化
v=strtol( str, &endptr, 10);
// 检查失败
if( (errno == ERANGE && (v == LONG_MAX || v == LONG_MIN))
|| (errno !=0 && v ==0) ) {
errno = EINVAL;
return 0;
}
if(endptr == str)
return 0;
// 成功,返回 v 的值
return v;
}
atoi() 函数的内部实现完全得益于 strtol() 函数,它是一个受信任缓旁袜的库函数,可以安全的把字符串转换成 LONG 类型的数字,假定字符串可以有效的表达数字。另外, strtol() 函数可以转换任何整型字符串,例如 16 进制和 8 进制,而 atoi() 只能处理 10 进制。
总而言之,atoi() 函数底层实现的秘密就是 strtol() 函数,它可以安全的将字符串转换成 LONG 类型的数字,假定字符串可以有效的表达数字。这个函数的参数还可以指定字符串的基数,例如 8 进制和 10 进制。最后,将转换后的数字返回给 atoi() 函数,并将其作为整数返回给程序。
❷ 用C++编一个和atoi功能一样的函数,实现字符到整形的转换
下面是实现功能的代码,函数的逗斗名字是myAtoi
int myAtoi (const char *value) {
register int ret, i, signFlag;
ret = i = 0;
signFlag = 1;
while ((*(value + i)) != 0x00) {
if ((*(value + i)) == 0x2d) {
signFlag = -1;
}
else if ((*(value + i)) >= 0x30 && (*(value + i)) <= 0x39) {
ret *= 10;
ret += ((int)(*(value + i)) - 48);
}
else if (
(ret != 0) &&
((*(value + i)) < 0x30 || (*(value + i)) > 0x39)
) {
return (ret * signFlag);
}
i += 1;
}
return (ret * signFlag);
}
如果是想测试,就用下面的代码
#include<stdio.h>
int myAtoi (const char *value) {
register int ret, i, signFlag;
ret = i = 0;
signFlag = 1;
while ((*(value + i)) != 0x00) {
if ((*(value + i)) == 0x2d) {
signFlag = -1;
}
else if ((*(value + i)) >= 0x30 && (*(value + i)) <= 0x39) {
ret *= 10;
ret += ((int)(*(value + i)) - 48);
}
else if (
(ret != 0) &&
((*(value + i)) <猜指培 0x30 || (*(value + i)) > 0x39)
) {
return (ret * signFlag);
}
i += 1;
}
return (ret * signFlag);
}
int main () {
char ch1[] = "-100";
char ch2[] = "穗唯- 034g1234";
char ch3[] = "";
printf (“%d\n%d\n%d\n", myAtoi (ch1), myAtoi (ch2), myAtoi (ch3));
return 0;
}
❸ 求C++获取系统时间源代码,精确到毫秒
#include <iostream>
#include <windows.h>
using namespace std;
void main()
{
SYSTEMTIME time;//时间结构声明,这个结构是系统的,
GetSystemTime( &time );//调用获取系统时间api.
//GetLocalTime();这个函数是获取本地时间api
char* t_y;
char* t_m;
char* t_h;
char* t_Min;
char* t_s;
char* t_Mi;
char* t_d;
char* t_w;
SYSTEMTIME time;//时间结构声明,这个结构是系统的,
GetSystemTime( &time );//调用获取系统时间api.
sprintf(t_y, "%d", time.wYear);//将年份格式输出到t_y变量中
sprintf(t_m, "%d", time.wMonth);
sprintf(t_w, "%d", time.wDayOfWeek);
sprintf(t_d, "%d", time.wDay);
sprintf(t_h, "%d", time.wHour);
sprintf(t_Min, "%d", time.wMinute);
sprintf(t_s, "%d", time.wSecond);
sprintf(t_Mi, "%d", time.wMilliseconds);
printf("%s,%s,%s,%s,%s,%s,%s,%s",
time.wYear,
time.wMonth,
time.wDayOfWeek,
time.wDay,
time.wHour,
time.wMinute,
time.wSecond,
time.wMilliseconds);
}
/***
SYSTEM 结构成员如下:
SYSTEMTIME STRUCT
{
WORD wYear ; 年
WORD wMonth ;月
WORD wDayOfWeek ;星期,0=星期日,1=星期一...
WORD wDay ;日
WORD wHour ;时
WORD wMinute ;分
WORD wSecond ;秒
WORD wMilliseconds ;毫秒
}SYSTEMTIME ENDS
//***/
❹ c语言中怎么把字符串中连续的数字变成一个数
C语言库函数名: atoi
功 能: 把字符串转换成整型数.
名字来源:array to integer 的缩写.
函数说明: atoi()会扫描此粗郑参数nptr字符串,如果第一个字符不森颂是数字也不是正负号返回零,否则开始做类型转换,之后检测到非数字或结束符 \0 时停止转换,返回整凳握型数。
原型: int atoi(const char *nptr);
需要用到的头文件: #include <stdlib.h>
程序例:
1)
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
int n;
char *str = "12345.67";
n = atoi(str);
printf("string = %s integer = %d\n", str, n);
return 0;
}
执行结果
string = 12345.67 integer = 12345
2)
#include <stdlib.h>
#include <stdio.h>
int main()
{
char a[] = "-100" ;
char b[] = "123" ;
int c ;
c = atoi( a ) + atoi( b ) ;
printf("c = %d\n", c) ;
return 0;
}
执行结果
c = 23
简单的实现atoi函数的源代码:
int my_atoi(const char *str){
int result = 0;
int signal = 1; /* 默认为正数 */
if((*str>='0'&&*str<='9')||*str=='-'||*str=='+'){
if(*str=='-'||*str=='+'){
if(*str=='-')
signal = -1; /* 输入负数 */
str++;
}
}
else return 0;
/* 开始转换 */
while(*str>='0'&&*str<='9')
result = result*10+(*str++ -'0');
return signal*result;
}
❺ c语言atoi函数源代码
c语言atoi函数源代绝禅码:
int atoi(char n[])
{int i,y=0;
for(i=0;n[i]>='0'悔好 && n[i]<='9';i++)
y=y*10+n[i]-'碧宏铅0';
return y;
}
❻ 如何用c语言实现atoi函数
要善用网络。。。网络就有atoi这个词条,里面有c语言实现的源代码(其实是c++,不过唯一的不同只是它的字符串定义为了const,即常量,表示在函数里不允许改变此字符串内容)
我在这里加上注释简单说明一下该源码
int
my_atoi(const
char
*str){
int
result;
//保存返回结果的
int
signal
=
1;
//保存符号的,默认正数
//判断第一个数字是否合法
if((*str>='0'&&*str<='9')||*str=='-'||*str=='+'){
//如果是-,符号变为-1,指针右移
//如果是+,指针右移(总之指向了第一个数字)
if(*str=='-'||*str=='+'){
if(*str=='-')
signal
=
-1;
str++;
}
}
else
return
0;//第一个不是+,-或数字,非法返回0
//这里就是转换,是数学的问题就不解释了
while(*str>='0'&&*str<='9')
result
=
result*10+(*str++
-'0');
return
signal*result;
}
不过这个程序,如果字符串是非法的话,他也会返回直到非法字符之前的数值
比如123abc
返回值就是123