flag是一个标志,为0的时候表示是等待输入状态,为1的时候表示已经有输入开始了。
while循环退出的条件有三个:
1. 读到字符串结束符'\0';
2. 输入字串长度达到100,防止越界;
3. flag1(是否继续标志)为n/N。
如果没有上述情况就要一直循环下去。
循环体首先读取输入,如果符合下述要求,else-if是不进入的,即始终处于读取状态而不转换:
1. 当前字符是数字;
2. 当前字符是a-f中的一个字母;
3. 当前字符是A-F中的一个字母;
如果满足这些,将始终处于读取输入的状态。否则开始进行转换,就是else -if处理了。
转换结束之后,把flag再置回0,确认是否continue之后,等于再次转回等待输入的状态,还继续循环刚才的操作。
问题1: if。。。。else if。。。 这种结构中,当if的条件不成立时,才会对else if的条件进行判定,如果为真就执行其语句。 如果是两个if,就会逐次进行判定。 这个程序中的else if 语句是当该16进制数读入结束时起作用的,当程序读到非16进制的字符时(空格,结束时的回车,其他字母如R T W Q等等等等)就会执行该语句(当然,前提是有读入过16进制字符,通过之前的if语句使flag=1)。
问题2: 这里的else 语句是当用户要再次输入时执行的,所以将flag重新赋值为0(之前为1),以回到初始状态。
我觉得你这个程序有问题吧...
else if(flag)//不是很理解这里用else if 而不是直接用if//还想问问发生什么情况时程序才执行else if 后面的语句(是因为输入了回车吗??)
在if……else if语句中,如果第一个if条件成立,则执行之,后面的elseif语句不执行。
如果把else if 改为if,则无论第一个if执行与否,第二个if都要进行判断是否执行。
这里应该用if吧... 然后执行后面的语句..是看if 后面的括号里面 的值 知否为零 非零的时候执行后面的语句.
flag=0;//不是很理解这里为什么又要初始化??//
if(flag)
flag 是个标记么...当他是0到9的时候 flag=0 不要转换..a到f的时候 令flag=1 证明你需要转换了...转换玩一次后...flag 也要回复原来的0啊... 要不然flag一直是1的话 就算你输入 0到9得数.. 也会一直执行if 之后的转换 的那些东西了..没有用啊...
还有啊..朋友一点分都没有啊...忒扣了吧..怎么也得象征性的给5分吧...
#include
#define MAX 1000
void main()
{ int func(char s[]);
int c,i=0,flag=0,flag1=1;
char t[MAX];
printf("请输入一个十六进制的数:\n");
while((c=getchar())! ='\0'&&i
{ flag=1;
t[i++]=c;
}
else if(flag)
{ t[i]='\0';
printf("十进制数为:%d\n",func(t));
printf("是否继续?");
c=getchar();
if(c=='N'||c=='n')
flag1=0;
else
{ flag=0;
i=0;
printf("\n输入一个十六进制的数:");
}
}
}
}
int func(char s[])
{
int i,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);
}