题目:

输入一个数字字符串,将其输出为整数输出。

不得调用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;
}

运行结果:

C语言解题 || 数字字符串转整数_#include