[User:root Time:22:14:20 Path:/home/liangdong/c]$ ./output
0 0 0
1 -1 1
2 -2 2
3 -3 3
4 -4 4
5 -5 5
6 -6 6
7 -7 7
8 -8 8
9 -9 9
10 -10 10
11 -11 11
12 -12 12
13 -13 13
14 -14 14
15 -15 15
16 -16 16
17 -17 17
18 -18 18
19 -19 19
20 -20 20
21 -21 21
22 -22 22
23 -23 23
24 -24 24
25 -25 25
26 -26 26
27 -27 27
28 -28 28
29 -29 29
30 -30 30
31 -31 31
32 -32 32
33 -33 33
34 -34 34
35 -35 35
36 -36 36
37 -37 37
38 -38 38
39 -39 39
40 -40 40
41 -41 41
42 -42 42
43 -43 43
44 -44 44
45 -45 45
46 -46 46
47 -47 47
48 -48 48
49 -49 49
[User:root Time:22:14:21 Path:/home/liangdong/c]$ cat src/main.c
#include
#include
#include
#include
int atoi(const char *nptr) {
int factor = 1;
if (strncmp(nptr, "+", 1) == 0) {
nptr += 1;
} else if (strncmp(nptr, "-", 1) == 0) {
nptr += 1;
factor = -1;
}
int n = 0;
while (*nptr != '\0') {
if (!isdigit(*nptr)) {
break;
}
n = (n * 10) + (*nptr - '0');
++ nptr;
}
return factor * n;
}
int main(int argc, char* const argv[]) {
char number[20];
int i;
for (i = 0; i < 50; ++ i) {
snprintf(number, 20, "+%d", i);
printf("%d ", atoi(number));
snprintf(number, 20, "-%d", i);
printf("%d ", atoi(number));
snprintf(number, 20, "%d", i);
printf("%d\n", atoi(number));
}
return 0;
}
NAME
atoi, atol, atoll, atoq - convert a string to an integer
SYNOPSIS
#include
int atoi(const char *nptr);
long atol(const char *nptr);
long long atoll(const char *nptr);
long long atoq(const char *nptr);
Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
atoll():
_BSD_SOURCE || _SVID_SOURCE || _XOPEN_SOURCE >= 600 || _ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L;
or cc -std=c99
DESCRIPTION
The atoi() function converts the initial portion of the string pointed to by nptr to int. The behavior is the same as
strtol(nptr, (char **) NULL, 10);
except that atoi() does not detect errors.
The atol() and atoll() functions behave the same as atoi(), except that they convert the initial portion of the string to their return type of long or
long long. atoq() is an obsolete name for atoll().
#include
#include
#include
#include
// never return an error
int atoi(const char *nptr) {
if (nptr == NULL) {
return 0;
}
int factor = 1;
if (strncmp(nptr, "+", 1) == 0) {
nptr += 1;
} else if (strncmp(nptr, "-", 1) == 0) {
nptr += 1;
factor = -1;
}
int n = 0;
while (*nptr != '\0') {
if (!isdigit(*nptr)) {
break;
}
n = (n * 10) + (*nptr - '0');
++ nptr;
}
return factor * n;
}
int main(int argc, char* const argv[]) {
char number[20];
int i;
for (i = 0; i < 50; ++ i) {
snprintf(number, 20, "+%d", i);
printf("%d ", atoi(number));
snprintf(number, 20, "-%d", i);
printf("%d ", atoi(number));
snprintf(number, 20, "%d", i);
printf("%d\n", atoi(number));
}
return 0;
}
int atoi(u_char *line, size_t n)
{
int value;
if (n == 0) {
return -1;
}
for (value = 0; n--; line++) {
if (*line < '0' || *line > '9') {
return -1;
}
value = value * 10 + (*line - '0');
}
if (value < 0) {
return -1;
} else {
return value;
}
}
int atoi(char* str,int *err)
{
int len=lstrlenA(str);
int ret=0;
int i=0;
if('-'==str[0]||'+'==str[0])
{
i=1;
}
for(;i{
if(str[i]<'0'||str[i]>'9')
{
*err=1;
ret=0;
break;
}
ret=ret*10+(str[i]-'0');
}
if('-'==str[0])
{
ret=~ret+1;
}
return ret;
}
#include效率应该还可以,不过如何判断是否有乘法溢出呢?用判断加减法溢出的方法行不通。判断是否有溢出标志?高人指教下。
#include
int zsh_atoi(const char *str)
{
int ret = 0;
int tmp;
int flag = 0;
if(!str) return 0;
while(isspace(*str)) ++ str;
if('-' == *str) {
flag = 1;
++str;
}
while(isdigit(*str)) {
tmp = ret * 10 + (*str - '0');
ret = tmp;
++str;
}
if(flag) return -ret;
return ret;
}
int main(int argc, char *argv[])
{
fprintf(stdout, "%d ...\n", zsh_atoi(" 1237891234567788324"));//有没有好的方法判断是否溢出
fprintf(stdout, "%d ...\n", zsh_atoi(" -456"));
fprintf(stdout, "%d ...\n", zsh_atoi("789abc"));
fprintf(stdout, "%d ...\n", zsh_atoi("abc789"));
fprintf(stdout, "%d ...\n", zsh_atoi("-abc"));
fprintf(stdout, "%d ...\n", zsh_atoi("-789abc"));
fprintf(stdout, "%d ...\n", zsh_atoi("abc789abc"));
fprintf(stdout, "%d ...\n", zsh_atoi("-abc789abc"));
return 0;
}