2 u012062455 u012062455 于 2013.09.09 21:53 提问

C语言程序运行时出现问题

/* Note:Your choice is C IDE */
#include "stdio.h"
void main()
{
char s1[80],s2[80];
int i,flag=1,resu;
printf("Please input s1 and s2:\n");
gets(s1);
gets(s2);
for(i=0;;i++)
{
if(s1[i]>s2[i])
{
printf("%d",s1[i]-s2[i]);
flag=0;
break;
}
if(s1[i]<s2[i])
{
printf("%d",s1[i]-s2[i]);
flag=0;
break;
}
if(s1[i]==s2[i]=='\0')
{
resu=0;
printf("%d",resu);
}
}
if(flag)
{
resu=0;
printf("%d",resu);
}
}
//这是我写的一行代码,该程序的功能是比较两个字符串s1和s2的大小,若s1大于s2输出一个正数,等于则输出0,小于则输出一个负数,不要用strcpy函数,输出的正数或负数的绝对值必须为相比较的两个字符串相应字符的ASCII码的差值,例如‘A’与‘C’相比就输出-2;输入and和and,输出应为0.但是当我输入and和and时,输出为-43,这是为何?求大神帮助。

3个回答

phoenixylf
phoenixylf   2013.09.10 09:13
已采纳

因为你在for循环当中,比较字符串的最后一个'\0'的时候,没有跳出循环,导致会比较数组中后面一些无效字符。所以结果可能为-43或其他的。当你比较到最后一个字符都为'\0',此时就应该结束循环,字符串的比较结果就为0;所以只要在循环里面那个比较最后一个字符的时候加一个break就可以了。结束循环不需要在判断flag的值,因为在循环中都已经将比较的结果处理完毕了。

u012062455
u012062455 呵呵,谢了,我已经做出来了。
4 年多之前 回复
phoenixylf
phoenixylf 囧,刚想起自己错了,二楼为正解。你可以改为s1[i]==s2[i]&&s1[i]=='\0';然后去掉你后面判断flag的,整个代码就可以实现你要的功能了!!
4 年多之前 回复
cj4461285
cj4461285   2013.09.10 10:01

最后那个不需要加break,你这代码有问题,if(s1[i]==s2[i]=='\0')这句的意思先是判断s1跟s2是否相等,再跟后面的‘\0’比较,所以你这个是进不去,resu没初始化,可以是任意的值;做比较最好用指针表示别用数组,指针好操作些

cj4461285
cj4461285 这里有运算符的先后顺序问题;if(s1[i]==s2[i]=='\0')这句话运算符是从左到右,先判断前面的值后得出来的结果是TRUE或FALSE,然后再用结果跟‘\0’比较,所以总是会进不去;你用s1[i]=='\0'&&s2[i]=='\0',就先判断s1[i]=='\0'是否相等,再判断s2[i]=='\0',把两者的结果再来逻辑与,lz应该理解吧
4 年多之前 回复
u012062455
u012062455 谢了,你说的是对的,我的指针还没学,不过为什么if(s1[i]==s2[i]=='\0')的功能和if(s1[i]=='\0'&&s2[i]=='\0')的功能会不同?
4 年多之前 回复
lvxinjian_cn
lvxinjian_cn   2013.09.10 16:30

不要用for循环,改成别的试试。而且你的编程思路也不是特别好。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!