c语言问题!二级考试题目
请编写一个函数fun,它的功能是:将一个数字字符串转换为一个整数(不得调用C语言提供的将字符串转换为整数的函数)。例如,若输入字符串"-1234",则函数把它转换为整数值...
请编写一个函数fun,它的功能是:将一个数字字符串转换为一个整数(不得
调用C语言提供的将字符串转换为整数的函数)。例如,若输入字符串"-1234",则
函数把它转换为整数值 -1234。函数fun中给出的语句仅供参考。
注意: 部分源程序存在文件PROG1.C文件中。
请勿改动主函数main和其它函数中的任何内容, 仅在函数fun的花括号中填
入你编写的若干语句。
答案:
#include <stdio.h>
#include <string.h>
long fun ( char *p)
{
/* 以下代码仅供参考 */
int i, len, t; /* len为串长,t为正负标识 */
long x=0;
len=strlen(p);
if(p[0]=='-')
{ t=-1; len--; p++; }
else t=1;
/* 以下完成数字字符串转换为一个数字 */
while(*p) x = x*10-48+(*p++);
return x*t;
}
main() /* 主函数 */
{ char s[6];
long n;
printf("Enter a string:\n") ;
gets(s);
n = fun(s);
printf("%ld\n",n);
}
其中while(*p) x = x*10-48+(*p++); 不懂求解释 ,为什么要这样写 那48怎么来的? 展开
调用C语言提供的将字符串转换为整数的函数)。例如,若输入字符串"-1234",则
函数把它转换为整数值 -1234。函数fun中给出的语句仅供参考。
注意: 部分源程序存在文件PROG1.C文件中。
请勿改动主函数main和其它函数中的任何内容, 仅在函数fun的花括号中填
入你编写的若干语句。
答案:
#include <stdio.h>
#include <string.h>
long fun ( char *p)
{
/* 以下代码仅供参考 */
int i, len, t; /* len为串长,t为正负标识 */
long x=0;
len=strlen(p);
if(p[0]=='-')
{ t=-1; len--; p++; }
else t=1;
/* 以下完成数字字符串转换为一个数字 */
while(*p) x = x*10-48+(*p++);
return x*t;
}
main() /* 主函数 */
{ char s[6];
long n;
printf("Enter a string:\n") ;
gets(s);
n = fun(s);
printf("%ld\n",n);
}
其中while(*p) x = x*10-48+(*p++); 不懂求解释 ,为什么要这样写 那48怎么来的? 展开
5个回答
展开全部
首先要知道c中的字符与其ASCII码是可以互换的,所以就有了将一个字符数字的ASCII码减去‘0’的ASCII码(48)变成这个数的方法。
比如‘1’的ASCII码是49,49减去48对应了1,所以这个可以将数字从字符型转成整形。也就是“-48+(*p++)”的功能。注意(*p++)是先取内容再加一。
变量x中存储了最终结果的值。转化是从高位向低位进行的,每次乘以10,就相当于把以前的数据扩大了10倍,比如:
x=1;
x=10+2;
x=12;
x=120+3;
x=123;
x=1230+4
x=1234
当p指向的字符为空时,这个循环结束。
欢迎交流讨论:)
比如‘1’的ASCII码是49,49减去48对应了1,所以这个可以将数字从字符型转成整形。也就是“-48+(*p++)”的功能。注意(*p++)是先取内容再加一。
变量x中存储了最终结果的值。转化是从高位向低位进行的,每次乘以10,就相当于把以前的数据扩大了10倍,比如:
x=1;
x=10+2;
x=12;
x=120+3;
x=123;
x=1230+4
x=1234
当p指向的字符为空时,这个循环结束。
欢迎交流讨论:)
展开全部
字符‘0’的ASCII值为0x30,也就是10进制的48
数字0的ASCII值为0x00,10进制为0
-48的目的是为了把字符转化成数字。
例如字符p[2] = "12",那么转换后的数字应为12。
那么计算过程为:
1、十位数应为p[0]的值为0x31(十进制为49),p[0]-48=1,在把1*10 = 10
2、各位数应为p[1]的值为0x32(十进制为50),p[1]-48=2,在把2
3、10+2 = 12
数字0的ASCII值为0x00,10进制为0
-48的目的是为了把字符转化成数字。
例如字符p[2] = "12",那么转换后的数字应为12。
那么计算过程为:
1、十位数应为p[0]的值为0x31(十进制为49),p[0]-48=1,在把1*10 = 10
2、各位数应为p[1]的值为0x32(十进制为50),p[1]-48=2,在把2
3、10+2 = 12
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
while(*p) x = x*10-48+(*p++);
只要*p有值就循环,
x=x乘10-48+p[0]
x=x乘10-48+p[1]
x=x乘10-48+p[2]
48是0的ASCII码,比如字符'0'-48=0,字符'1'-48=1;所以(*p++)-48就是要求的那个数字。
每次乘10就是前进一位,空出个位再加上(*p++)-48。
最后循环结束就是最终答案。
只要*p有值就循环,
x=x乘10-48+p[0]
x=x乘10-48+p[1]
x=x乘10-48+p[2]
48是0的ASCII码,比如字符'0'-48=0,字符'1'-48=1;所以(*p++)-48就是要求的那个数字。
每次乘10就是前进一位,空出个位再加上(*p++)-48。
最后循环结束就是最终答案。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
0的字符表示貌似是48吧 假设*p=1 那么字符表示就是49 (*p++)-48 就=1 就转换成了数字了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
48就是'0',数字0的ASCII码
这一句等价于
int c;
while(*p)
{
x*=10;
c=*p-'0';
x+=c;
p++;
}
这一句等价于
int c;
while(*p)
{
x*=10;
c=*p-'0';
x+=c;
p++;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |