题目:
输入一个数字字符串,将其输出为整数输出。
不得调用C语言提供的将数字字符串转化为整数的库函数来完成。
输入输出示例:
输入:-1234
输出:-1234
分析:
这种题我们有一种通用的算法:n = n * 10 + *p - '0'
while (*p)//p为指向“数字字符串 首位字符地址”的指针
{
n = n * 10 + *p - '0';
p++;
}
利用这个算法,我们可以轻易解题。
其中,
*p - '0' 是为了将字符转化为整数。因为字符’0‘和数字0直接的ascll码值刚好相差了一个’0‘(48)。
n * 10是为了将整数不断乘以基数10。视觉上,就是将 n 向左移动 1 位。而空出来的最右边,则用“*p字符转换后的数字”来填充。
现在我们来演示一下为什么这个算法可以转化数字字符串为整数:
以数字字符串”123\0“为例,
第1轮
n = n * 10 + *p - '0' ---> n = 0 * 10 + 1 ---> n = 1
第2轮
n = n * 10 + *p - '0' ---> n = 1 * 10 + 2 ---> n = 12
第3轮
n = n * 10 + *p - '0' ---> n = 12 * 10 + 3 ---> n = 123
第4轮
*p == '\0',循环结束,n = 123
代码实现:
我们用了2种方法实现,更推荐第一种。
1.使用上面分析的算法来实现
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
#include <math.h>
long Fun(const char* p)
{
assert(p);
int i = 0;
long n = 0;
int count = 0;
int flag = 1;
//检查正负属性
if (*p == '-')
{
flag *= -1;
p++;
}
else if (*p == '+')
{
p++;
}
//直接转换
while (*p)
{
n = n * 10 + *p - '0';
p++;
}
return n * flag;
}
int main()
{
char s[10] = { 0 };
long n = 0;
printf("Enter a string:\n");
scanf("%s", s);
n = Fun(s);
printf("%ld\n", n);
return 0;
}
2.不使用上面的算法。这种方法略为臃肿,推荐前一种方法实现
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
#include <math.h>
long Fun(char* p)
{
assert(p);
int i = 0;
long n = 0;
int count = 0;
int flag = 1;
//检查正负属性
if (*p == '-')
{
flag *= -1;
p++;
}
else if (*p == '+')
{
p++;
}
//检查是几位数
for (count = 0; *(p + count); count++)
{
;//空语句
}
//开始转换
p += count - 1;
for (i = 0; i < count; i++)
{
n += (*p - '0') * (int)pow(10, i);
p--;
}
if (flag < 0)
{
n *= -1;
}
return n;
}
int main()
{
char s[10] = { 0 };
long n = 0;
printf("Enter a string:\n");
scanf("%s", s);
n = Fun(s);
printf("%ld\n", n);
return 0;
}