初学C语言,请大家帮我看看这个问题,输出结果不对啊

作者&投稿:钟离贪 (若有异议请与网页底部的电邮联系)
C语言,谁帮我看看下面这一题啊,哪里出问题了,输出结果和题目不一样~

代码没有什么问题,主要是读取输入时不正确,特别是修改3那儿?为什么要getchar,并丢弃?
是想处理回车换行吗?你这样做,实际上把字符串的第一个字符给丢弃了。

#include
#include
#include
using namespace std;
#include
#include
long htoi(char s[]) /*将十六进制数转化为十进制*/
{
long i,n=0;
for(i=0; s[i]!='\0'; i++)
{
if(s[i]>='0'&&s[i]<='9')
n=n*16+s[i]-'0';
else if(s[i]>='A'&&s[i]<='F')
n=n*16+s[i]-'A'+10;
else if(s[i]>='a'&&s[i]<='f')
n=n*16+s[i]-'a'+10;
}
return n;
}
long haiming(char* a,char* b) /*计算海明距离*/
{
long num=0,mask;
long m=htoi(a);
long n=htoi(b);
long t=m^n;
for (mask=524288; mask>=1; mask /=2)
if ((t & mask)!=0) num++;
return num;
}
int main()
{
long k,n,i,j,x,min,t;/*k:测试对数,n:每一组数据的个数*/
scanf("%d
",&k); //<=========修改1
for(x=0; x<k; x++)
{
char** a;
scanf("%d
",&n);//<=========修改2
/*动态申请二维数组a[n][10]*/
a=(char**)malloc(n*sizeof(char *));
for(i=0; i<n; i++)
a[i]=(char *)malloc(6*sizeof(char));
/*输入二维数组a[n][5]*/
for(i=0; i<n; i++)
{
gets(a[i]);
//getchar(); //<=========修改3
}
/*计算海明距离*/
for(i=0,min=20; i<n-1; i++)
{
for(j=i+1; j<n; j++)
{
t=haiming(a[i],a[j]);
if(t<min) min=t;
}
}
printf("%d
",min);
/*释放二维数组*/
for(i=0; i<n; i++)
free(a[i]);
free(a);
fflush(stdin); //清空缓存区
}
return 0;
}

你是WA还是CE

结果是正确的,有几个要点:
1 、像类似 a=b=c 的赋值语句是从右侧往左进行的,即先c赋值给b,b再赋值给a
2 、== 表示判断时候相等,不是赋值
3 、printf函数格式化参数的判别顺序是从右向左
结合上面几点,打印结果说明如下:
(1) 最右边的d 是因为你的printf的最后一个格式化串写错了(你写成了d%)
(2) a==(b=c) 是先进行b=c的赋值操作,即此时b为3,再进行a==b的比较运算(a为1),显然不相等,比较的结果为假,转换成整形输出就是 0
(3) a=b==c 是先进行b==c的比较操作,上一步中b已经是3了,所以此时b等于c,即b==c的结果为真,即为1,再进行赋值运算,将1赋给了a,此时a的值为1,所以打印1
(4) a=b=c 先进行 b=c的赋值运算,b等于3,再进行a=b的赋值运算,a等于3,打印结果是3

输出的数中最后两个输出的是判定值,前两个是给a赋值,=默认从右向左赋值,所以第一个a=3,第二个是把b==c的值赋给a,因为之前已经让a和b都变成3了,所以b==c的值为真也就是1。第三个b=c的值为1,但a的值为3,所以肯定是错的。至于第四个我个人认为是你的编译器有问题或者你的代码贴的有问题,b==c的值为1,而a的值为3,所以第四个结果应该也为0,最后的结果应该为
3 1 0 0

第一个%d 输出的内容是a,而a=b=c是把c赋给b和a,所以a=b=c=3,输出3
第二个%d 输出的内容是a,a的值为b==c的判断,因为上一句有赋值语句所以此时b=c=3的,为真,所以返回1,a=1,输出1
第三个%d输出的内容是a==(b=c)的判断,b=c=3,但是a之前的值已经为1,因此a!=(b=c),判断为假,返回0,输出0
第四个d%,是不是写反了,所以就输出一个d,%后面啥都没有

你的程序要表达什么啊? 想要输出什么?1.a=b=c;这里赋值符号是从右边到左边的运算;意思是把c的值赋值给b;再奖b的值赋值给a;所有a最后就等于3;
2.a=b==c; ==是逻辑运算 运算的对象是常量。后边都是同一个毛病。多看看书吧

你最后一个写成了d%,是%d,结果3,1,0,0没错

初学C语言,帮我看看这个输出结果为什么是0?
答:1、因为你刚开始定义a,b是int类型的,整形的。2、所以在a进行计算的时候会将12+12.4这个算式(a=12+12.4)计算成24,计算机自动将a语句的结构保存成整数型。3、在你将b的值赋值为浮点型的a(b=(float)a;)时,结果其实应该是24.00。4、但是由于你并未给b改变类型,所以他还是一个整形,在...

初学C语言,请大家帮我看看这个问题,输出结果不对啊
答:1 、像类似 a=b=c 的赋值语句是从右侧往左进行的,即先c赋值给b,b再赋值给a 2 、== 表示判断时候相等,不是赋值 3 、printf函数格式化参数的判别顺序是从右向左 结合上面几点,打印结果说明如下:(1) 最右边的d 是因为你的printf的最后一个格式化串写错了(你写成了d%)(2) a==(b=...

请高手帮我看看我这个c语言程序哪出问题了,谢谢,我是初学者。
答:哈 主函数的名字是main,不要写错啦。您可以把错误输出窗口下拉,就能看到一些错误提示(包括工程目录 源文件路径、代码行号及错误原因),初学时语法拼写类的失误就靠它。但绝不要依赖,应该持严谨科学的态度,有效率的做法是编码之间、之前先人工反复地细心地检查您的代码(静态调试),自确认无误之后再...

c语言题,本人新手,麻烦帮我看看这段代码!老是输出不正确。谢谢了。用1...
答:y=2*x;z=3*x;a=x/100;b=(x/10)%10;c=x%10; //把三位数的每一位数字截下来,a,b,c分别为百,十,个位 d=y/100;e=(y/10)%10;f=y%10;g=z/100;h=(z/10)%10;i=z%10;str[0]=a;str[1]=b;str[2]=c;str[3]=d;str[4]=e;str[5]=f;str[6]=g;str[7]=h;...

有大佬帮我看看哪里错了吗,刚开始自学c语言
答:1、首先scanf输入格式不需要写空格,默认就是空格分割scanf("%lf %lf",&m,&n) ;直接写成scanf("%lf%lf",&m,&n) ;就可以了,%lf之间不需要加空格。2、在C语言中,大于且小于,不能写成18.5<b<23.9,要写if(b>18.5 && b<23.9)。&&表示与,意思左右两边逻辑表达式同时成立,返回1。

C语言单片机程序 初学大家帮忙看看错在哪里了 #include <reg51.h...
答:也有可能是你烧写程序的时候 数据传输的过程中出错了,校验出错 一般是传输过程中某个或者某些bit或者byte出错 建议你重新编译 重新下载烧写试试, 单片机这东西就是经常出些小问题,有时候我们买的开发板或者有些数据线质量不过关也会导致一些莫名其妙的问题,多尝试尝试 相信你能解决的 ...

帮我看看这个c语言程序哪里错了,我是初学者。输出的是一连串0
答:没问题啊 就是方向反了吧 从大到小而已 if(a[i]

我是c语言初学者,什么都不会,大家看看我这个怎么了 ,哪里错了
答:主函数的结束大括号位置错了。输出格式%后面少了c 修改后代码如下所示 include <stdio.h> int main(void){ char a = 'x';printf("你好,互联网技术%c\n", a);return 0;}

刚学C语言,从网上找了几个代码玩,请大佬帮我看看我这个错哪了?
答:程序完全没有问题的:

刚学C语言,哪个帮我看看这个程序
答:10%,7.5%这种百分数表示方式,是不符合C/C++语言标准的。需要写成0.1,0.075。另外,由于需要记录这些值,a,c需要声明为double型。还有一些细节的错误,具体的看后面程序的注释吧 这么改:include<stdio.h> void main(){ double a,c=0; //注意,这里c必须初始化为0 scanf("%lf",&a);if(a...