if语句中的语句失效

NianNian酱 2014-07-21 12:56:23
#include<stdio.h>

#define HEX 16

int htoi(char s[]);
main()
{
int i,a;
char c,s[20];
for(i = 0;i < 20 && (c = getchar())!= '\n'; ++i)
s[i] = c;
if(s[0] == '0' && (s[1] == 'x' || s[1] == 'X')){
a = htoi(s);
printf("The number is %d.\n",a);
}
else printf("Error!");
return 0;
}

int htoi(char s[])
{
int i = 2;
int n = 0;

while(s[i] != '\0' && s[i] != '\n'){
if(s[i] >= '0' && s[i] <= '9'){
n = n * HEX + (s[i] - '0');
++i;}
else if(s[i] >= 'a' && s[i] <= 'f'){
n = n * HEX + (s[i] - 'a' + 10);
++i;}
else if(s[i] >= 'A' && s[i] <= 'F'){
n = n * HEX + (s[i] - 'A' + 10);
++i;}
}
return n;
}



htoi 函数中,++i全部无效,但是改为这样:

int htoi(char s[])
{
int i = 2;
int n = 0;

while(s[i] != '\0' && s[i] != '\n'){
if(s[i] >= '0' && s[i] <= '9')
n = n * HEX + (s[i] - '0');
else if(s[i] >= 'a' && s[i] <= 'f')
n = n * HEX + (s[i] - 'a' + 10);
else if(s[i] >= 'A' && s[i] <= 'F')
n = n * HEX + (s[i] - 'A' + 10);
++i;
}
return n;
}


就可以正常运行。
求各位大神,这是为什么?前一种为何输入后无任何结果输出?程序处在卡死状态。
...全文
487 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
NianNian酱 2014-07-21
  • 打赏
  • 举报
回复
谢谢各位的帮助和教导!
NianNian酱 2014-07-21
  • 打赏
  • 举报
回复
引用 2 楼 Intel0011 的回复:
// 初始化,如果不初始化的话,数组里面含有随机值, // 按照你的第一方式,如果随机值不是0-9,a-f,A-F,变量i根本不会自增,所以无限循环 // 你的第二方式即使判断不成立也会自增
果然是这样……我输出了一下未初始化的数组,都是乱码……在for循环后补充一个 '\0' 就可以正常运行了。
NianNian酱 2014-07-21
  • 打赏
  • 举报
回复
呃……我在最后一个else if后面补了 else break; 后,就能输出正确结果了……我输入的是 0x11,为什么会3种条件都不满足?
赵4老师 2014-07-21
  • 打赏
  • 举报
回复
写if不写对应else的程序员都是在踩钢丝!
  • 打赏
  • 举报
回复
引用 楼主 u012184298 的回复:
#include<stdio.h>

#define HEX 16

int htoi(char s[]);
main()
{
	int i,a;
	char c,s[20];
	for(i = 0;i < 20 && (c = getchar())!= '\n'; ++i)
		s[i] = c;
	if(s[0] == '0' && (s[1] == 'x' || s[1] == 'X')){
		a = htoi(s);
		printf("The number is %d.\n",a);
	}
	else printf("Error!");
	return 0;
}

int htoi(char s[])
{
	int i = 2;
	int n = 0;
	
	while(s[i] != '\0' && s[i] != '\n'){
		if(s[i] >= '0' && s[i] <= '9'){
				n = n * HEX + (s[i] - '0');
				++i;}
		else if(s[i] >= 'a' && s[i] <= 'f'){
				n = n * HEX + (s[i] - 'a' + 10);
				++i;}
		else if(s[i] >= 'A' && s[i] <= 'F'){
				n = n * HEX + (s[i] - 'A' + 10);
				++i;}			  
		}
	return n;
}


htoi 函数中,++i全部无效,但是改为这样:
int htoi(char s[])
{
	int i = 2;
	int n = 0;
	
	while(s[i] != '\0' && s[i] != '\n'){
		if(s[i] >= '0' && s[i] <= '9')
				n = n * HEX + (s[i] - '0');
		else if(s[i] >= 'a' && s[i] <= 'f')
				n = n * HEX + (s[i] - 'a' + 10);
		else if(s[i] >= 'A' && s[i] <= 'F')
				n = n * HEX + (s[i] - 'A' + 10);
		++i;		  
		}
	return n;
}
就可以正常运行。 求各位大神,这是为什么?前一种为何输入后无任何结果输出?程序处在卡死状态。
这几种状态之外,还有别的状态。
starytx 2014-07-21
  • 打赏
  • 举报
回复
没有什么奇怪的,前边的++i都在你的三种条件里,很明显不执行的话意味着三种条件都不满足。修改后的结构,++i就和if语句没有关系了,他只是循环中的一句,每次循环都会执行
Saleayas 2014-07-21
  • 打赏
  • 举报
回复
你的 else 呢?? 编程要严谨。
Intel0011 2014-07-21
  • 打赏
  • 举报
回复
// 初始化,如果不初始化的话,数组里面含有随机值, // 按照你的第一方式,如果随机值不是0-9,a-f,A-F,变量i根本不会自增,所以无限循环 // 你的第二方式即使判断不成立也会自增
Intel0011 2014-07-21
  • 打赏
  • 举报
回复
#include<stdio.h>

#define HEX 16

int htoi(char s[]);
main()
{
	int i,a;
	int c;    // getchar()返回int
       char s[20] = { '\0' };  // 初始化,如果不初始化的话,数组里面含有随机值,按照你的第一方式,如果随机值不是0-9,a-f,A-F,变量i根本不会自增,所以无限是=循环;你的第二方式即使判断不成立也会自增
	for(i = 0;i < 20 && (c = getchar())!= '\n'; ++i)
		s[i] = c;

	if(s[0] == '0' && (s[1] == 'x' || s[1] == 'X')){
		a = htoi(s);
		printf("The number is %d.\n",a);
	}
	else printf("Error!");
	return 0;
}

int htoi(char s[])
{
	int i = 2;
	int n = 0;
	
	while(s[i] != '\0' && s[i] != '\n'){
		if(s[i] >= '0' && s[i] <= '9'){
				n = n * HEX + (s[i] - '0');
				++i;}
		else if(s[i] >= 'a' && s[i] <= 'f'){
				n = n * HEX + (s[i] - 'a' + 10);
				++i;}
		else if(s[i] >= 'A' && s[i] <= 'F'){
				n = n * HEX + (s[i] - 'A' + 10);
				++i;}			  
		}
	return n;
}

69,374

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧