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

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

C语言求助,哪位大佬帮我看看这道题?一直搞不清楚
a[top].xb="女"; cout<<"请输入年龄:"; cin>>a[top].nl; cout<<"请输入电话:"; cin>>a[top].dh; sort(a+1,a+top+1,cmp);}void cz(){ string name; cout<<"请输入删除者的姓名:"; cin>>name; for(int i=1; i<=50; i++) if(a[i].xm==name) { a[i].xm="无"; a[i]...

初学C语言,帮我看看这个输出结果为什么是0?
4、但是由于你并未给b改变类型,所以他还是一个整形,在你结尾时引用lf浮点型的输出方式进行输出时,计算机识别不出来,所以结果为零。希望可以帮到你,如果还有什么问题可以在下边留言。

求大家帮忙看看这个C语言题目啊,蟹蟹蟹蟹~
这导致30个0.1相加,不是严格地等于3.0,(即使到了应该为3.0的那个点,因为误差的原因,不是与实数3.0相等)所以,就会发生“死循环”了。所以,通常情况下,要避免直接比较二个实型量x,y是否相等,而是改为比较二个实型量之差的绝对值是否小于允许的误差。例如10的-8次方等等。避免使用if(x...

请大家看看这道题用c语言怎么做?
因此,可以将这些规则用代码实现。以下是C语言的实现代码:include <stdio.h> int calculate_gold(int days) { int total_gold = 0; \/\/ 总金币数 int current_day = 1; \/\/ 当前天数 int reward = 1; \/\/ 当前奖励数额 while (current_day <= days) { \/\/ 计算当前阶段的天数 for (int ...

C语言求帮我看看这个数组题! #include<stdio.h>#define N 10void...
include<stdlib.h> define N 10 void printarr(double a[],int n);double maxnum(double a[],int n);double average(double a[],int n);int find(double a[],int n,double x);void BubbleSort(double a[],int n);int main(){ double array[N],x;int i,n;double max;double ave...

c语言 大家看看 default的位置问题
int main(void){ int k=5,n=0;while(k>0){ switch(k){ case 1: n+=k;default: break;case 2:case 3: n+=k;} k--;} printf("%d",n);} k=5,break k=4,break k=3,n=0+3=3 k=2,n=3+2=5 k=1,n=5+1=6,break default可以放在switch语句中的任何位置。。第二个 ...

一道C语言编程问题,高手们来看看帮忙解答下
int main(){ int a;\/\/定义循环变量。int b;int c;int sum;\/\/ABC之和。for (a = 100;a > 0;a--)\/\/以A为循环变量,在1到100之间。{ for (b = a-1;b > 0;b--)\/\/以B为循环变量,在1到A之间。{ for (c = b-1;c > 0;c--)\/\/以C为循环变量,在1到B之间。{ \/\/...

帮我看看2道简单的C语言题目
1.y=6,y=x>7? 6:5;的意思是如果x>7的话y=6,否则等于5。2.j=6,k=7 ,k++的意思是先取k的值,再给k+1,和++k不同。如果j=++k,那么先给k+1,再取k的值,即j=7,k=7.

C语言的问题,帮忙看看怎么做,谢谢!
断点调试这样子 至于你的问题,感觉有点奇怪,因为数组并没完全初始化,for里面i < XX那里写得好纠结 按i正常点的算(第一个for里i < 10, 第二个for里i < 9),第一张表里:a = 2, 3, 4, 5, 6, 7, 8,9,10,11 b = 0, 3, 6, 9, 12, 15, 18, 21, 24, ...