请高手给我解释一下这个程序!谢谢!
/*输入十六进制输出对应的十进制数*/
#include "stdio.h "
#define MAX 1000
void main()
{
int htoi(char s[]);
int c,i,flag,flag1;
char t[MAX];
i=0;
flag=0;
flag1=1;
printf( "\ninput a HEX number: ");
while((c=getchar())!= '\0 '&&i <MAX&&flag1)
{
if(c> = '0 '&&c <= '9 '||c> = 'a '&&c <= 'f '||c> = 'A '&&c <= 'F ')
{
flag=1;
t[i++]=c;
}
else if (flag)
{
t[i]= '\0 ';
printf( "decimal number %d:\n ",htoi(t));
printf( "continue or not ? ");
c=getchar();
if(c== 'N '||c== 'n ')
flag1=0;
else
{
flag=0;
i=0;
printf( "\ninput a HEX number: ");
}
}
}
}
int htoi(char s[])
{
int i,n;
n=0;
for(i=0;s[i]!= '\0 ';i++)
{
if(s[i]> = '0 '&&s[i] <= '9 ')
n=n*16+s[i]- '0 ';
if(s[i]> = 'a '&&s[i] <= 'f ')
n=n*16+s[i]- 'a '+10;
if(s[i]> = 'A '&&s[i] <= 'F ')
n=n*16+s[i]- 'A '+10;
}
return(n);
}
问题1:请问while((c=getchar())!= '\0 '&&i <MAX&&flag1) 这句为什么能使得可以从 终端输入多个字符啊?getchar()不是输入一个字符吗?
问题2:if(c> = '0 '&&c <= '9 '||c> = 'a '&&c <= 'f '||c> = 'A '&&c <= 'F ')通过找个if条件后为什么还继续执行下边的else语句!if与else不是都只执行其中一个吗?
问题3:请高手有空的话再给我解释解释整个过程!谢谢!
[解决办法]
标准终端输入是有缓存的,你在键盘敲的字母都存在一个缓冲区呢,getchar每次从缓冲区内取出一个字符
问题2没看明白,
肯定先要判断if的条件啦,条件不满足,再判断else if,如果还不满足,然后才是else
[解决办法]
1、while()括号里的条件为真的话就是一个循环,所以可以输入多个字符。
2、是else if吧,不是else。else if 和if是并行的吧
3、慢慢看下,呵呵
[解决办法]
问题1:请问while((c=getchar())!= '\0 '&&i <MAX&&flag1) 这句为什么能使得可以从 终端输入多个字符啊?getchar()不是输入一个字符吗
-----------------------------------
因为while循环每执行一次,就要执行一次getchar()
问题2:if(c> = '0 '&&c <= '9 '||c> = 'a '&&c <= 'f '||c> = 'A '&&c <= 'F ')通过找个if条件后为什么还继续执行下边的else语句!if与else不是都只执行其中一个吗?
--------------------------------------
那你要看这个else是否是和这个if对应的
问题3:请高手有空的话再给我解释解释整个过程!谢谢!
-------------------------------------------------
肚子和我闹别扭了。
[解决办法]
给你解释一下那个转化的函数吧,原理是这样,例如对于一个四位的十六进制数x1x2x3x4,对应的十进制数就是16*(16*(16*x1+x2)+x3)+x4,位数多的情况以此类推。
int htoi(char s[])
{
int i,n;
n=0;
for(i=0;s[i]!= '\0 ';i++)
{
if(s[i]> = '0 '&&s[i] <= '9 ') //s[i]- '0 '是把字符转换为对应整数
n=n*16+s[i]- '0 ';
if(s[i]> = 'a '&&s[i] <= 'f ') //大写小写都一样,a~f和A~F转换为10~15
n=n*16+s[i]- 'a '+10;
if(s[i]> = 'A '&&s[i] <= 'F ')
n=n*16+s[i]- 'A '+10;
}
return(n);
}
[解决办法]
大概看了下, 流程是这样的:
1、while((c=getchar())!= '\0 '&&i <MAX&&flag1),这里在get 终端中输入的数据,最多输入1000个.而且有flage1,是你也想输入数据
2、是一个if else的判断.if(输入的必须为字母或者数字)
并把get到的放到t[]中.
用十进制打印出来,htoi(t[]),这个就是转换函数
else(已经读取完成)
提示是否还有输入.