2 u012667066 u012667066 于 2016.03.17 13:48 提问

同样代码VC6.0结果正确,GCC编译运行结果不正确,原因是什么呢?谢谢!

#include

int main()
{
char deno[1000]={'\0'},num,i=0,remain=0;
scanf("%s %d",deno,&num); //获取被除数、除数
if(!num) return (-1);

while(deno[i]!='\0')    
    deno[i++]-='0'; //转换成数字
deno[i]='#';        //结束标志
i=0;
while(deno[i]!='#')
{
    deno[i]+=remain;            //低位+高位余数
    remain=10*(deno[i]%num);    //高位余数
    deno[i]=deno[i]/num+'0';    //商的ASCII码    
    i++;
}
deno[i]='\0';   //串尾
remain/=10;     //最后余数

if(deno[0]=='0'&&deno[1]!='\0') //高位0不显示
    printf("%s %d",&deno[1],remain);
else
    printf("%s %d",deno,remain);
return 0;

}

VC++6.0下运行结果:
图片说明
图片说明
图片说明
GCC编译后运行结果:
图片说明

5个回答

Longyu_wlz
Longyu_wlz   2016.03.21 08:41
已采纳

(gdb) n
12 4

Breakpoint 1, main (argc=1, argv=0x7fffffffe288) at source.c:7
7 if(!num) return (-1);
(gdb) p deno
$1 = '\000'
(gdb) p deno[0]
$2 = 0 '\000'
(gdb)

gameuu
gameuu   2016.03.17 21:48

会不会是gcc大小端的问题?

u012667066
u012667066 回复nooneic: 对了 我用的是minGW gcc4.9.3 能正确读入输出就不会是大小端问题了吧 我也是刚刚百度了下才知道大小端什么意思
一年多之前 回复
u012667066
u012667066 我晚上回来重新排查了一遍 发现scanf("%s %c",deno,&num);num-='0'能正确读入输出,把num的数据类型改成int也能正确读入输出,不太理解原因。 并且我之前写的一个程序有一句是scanf("%s %s %d", stu[i].name,stu[i].no,&stu[i].score);而这三者(均为uchar)都能正确读入....然后我就写了一个测试程序,发现均为char或uchar类型的变量下scanf("%s %s %d",str1,str2,&num); str2读入失败,num为int或者用%c则读入正确 实在是无语....请问你知道发生了什么吗?晕死了
一年多之前 回复
u012667066
u012667066   2016.03.17 13:53

我也不知道为什么代码插入进去会这样子 - - 试过几次了 第一次发帖问

Longyu_wlz
Longyu_wlz   2016.03.21 09:05

我不想改下去了。在这里你有些概念不清。
这里跟小端大端的数据存储方式没有什么关系。数组本身就是连续存放的单元,不存在什么小端大端的存储问题。

Longyu_wlz
Longyu_wlz   2016.03.21 09:18

scanf(“%s %d”,deno,&num);
在这里,你给编译器出了一个难题!%s %d ,在这个输入中%s为字符串,那我问你——空格算不算字符?
vc强大,能替你解决这些问题,用空格来区分两个输入。
gcc个性,直接罢工。你输入的字符串永远不会被读入并存储到字符数组中,字符数组的每一项都是0,结果也就为0了。
所以,取决于你要用哪个!我还是建议你 改改自己的代码,注意编码风格!加上该加的空格!
言尽于此!

u012667066
u012667066 回复nooneic: ...不小心多按了两次回车....谢谢你的回答~
一年多之前 回复
u012667066
u012667066 谢谢你的回答,我以为不会有人回答了呢......%s是以空格、tab和回车作为结束符的,gcc也是如此。问题在于我贪心地用char类型定义num,用%d获取输入,VC支持这么搞,minGW的gcc不报警但不支持。我用gcc (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4,可以编译但有warning说类型不符合,同样无法正确读入。总之,的确是自己作死........另外,同学你说的加空格是指代码等号两边么?之前纠结过加还是不加的问题,但是在IDE或者gedit里都用颜色区分开来,故不加也不显得乱,可能个人感觉不一样,加空格确实挺好的,但我不是很喜欢。谢谢!
一年多之前 回复
u012667066
u012667066 谢谢你的回答,我以为不会有人回答了呢......%s是以空格、tab和回车作为结束符的,gcc也是如此。问题在于我贪心地用char类型定义num,用%d获取输入,VC支持这么搞,minGW的gcc不报警但不支持。我用gcc (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4,可以编译但有warning说类型不符合,同样无法正确读入。总之,的确是自己作死........另外,同学你说的加空格是指代码等号两边么?之前纠结过加还是不加的问题,但是在IDE或者gedit里都用颜色区分开来,故不加也不显得乱,可能个人感觉不一样,加空格确实挺好的,但我不是很喜欢。谢谢!
一年多之前 回复
u012667066
u012667066 谢谢你的回答,我以为不会有人回答了呢......%s是以空格、tab和回车作为结束符的,gcc也是如此。问题在于我贪心地用char类型定义num,用%d获取输入,VC支持这么搞,minGW的gcc不报警但不支持。我用gcc (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4,可以编译但有warning说类型不符合,同样无法正确读入。总之,的确是自己作死........另外,同学你说的加空格是指代码等号两边么?之前纠结过加还是不加的问题,但是在IDE或者gedit里都用颜色区分开来,故不加也不显得乱,可能个人感觉不一样,加空格确实挺好的,但我不是很喜欢。谢谢!
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!