c语言段错误初学者不知道错误在哪里

等 级:论坛游民
专家分:18
程序应该没问题,你是不是输入的字符串超过了数组的范围
等 级:论坛游民
帖 子:47
专家分:77
程序没问题,可以正常运行。
等 级:论坛游民
帖 子:21
专家分:38
正确的啊!可以运行
等 级:新手上路
。。结果就是错了!!!大家好好想想。。。。
版权所有,并保留所有权利。
Powered by , Processed in 0.022377 second(s), 8 queries.
Copyright&, BCCN.NET, All Rights Reserved请大家帮我看看《水王争霸》这道题,找了好久都没找出错误,一直wrong answer,我是c语言初学者,一些高深的代码还看不懂…………
[问题点数:40分,结帖人u]
请大家帮我看看《水王争霸》这道题,找了好久都没找出错误,一直wrong answer,我是c语言初学者,一些高深的代码还看不懂…………
[问题点数:40分,结帖人u]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关帖子推荐:
2013年6月 C/C++大版内专家分月排行榜第三
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。小学生数学 很多小学生在学习加法时,发现&进位&特别容易出错。你的任务是计算两个数在相加时需要多少次进位。你编制的程序应当可以连续处理多组数据,直到读到两个0(这是输入结束标记)。
输入 123 456 555 555 123 594 0 0
输出:0 3 1
1 #include &stdio.h&
2 #include &math.h&
3 int Take_number(int x,int y)
//定义函数取整数X的第Y位
printf("wrong number\n");
temp=(int)pow(10,y-1);
return temp%10;
17 int count(int x)
//定义函数取位数
int i,carry,
for(i=0,count=1;;i++)
carry=(int)pow(10,i);
if(x/carry==0)
else count++;
30 int main()
int a[100],temp,i,j,carry[10];
int Take_number(int x,int y);
int count(int x);
printf("plese input the number and end with 0 0\n");
for(i=1;;i+=2)
//输入相应数值
scanf("%d%d",&a[i-1],&a[i]);
if(a[i-1]==0 && a[i]==0)
for(i=1;a[i-1]!=0;i+=2)
for(j=1,temp=0;j&=(a[i-1]&a[i]?count(a[i-1]):count(a[i]));j++)
carry[j]=0;
if(carry[j-1])
//若前一位有进位,该位相加为9也有进位
if(Take_number(a[i-1],j)+Take_number(a[i],j)&=9)
carry[j]=1;
carry[j]=0;
if(Take_number(a[i-1],j)+Take_number(a[i],j)&=10)
//若前一位无进位,相加为10才有进位
carry[j]=1;
if(carry[j])
temp=temp+1;
printf("%d\n",temp);
  题目比较有趣,但代码乏善可陈。
int a[100],temp,i,j,carry[10];
&  还是变量定义太多,并不必要地使用了数组这种复杂的数据结构,表明作者缺乏大局观,对代码的整体设计错误。其实这里只需要两个变量就足够了,就是存储要做加法的那两个数。题目在这里也有欠严密,没提这两个数应该是正整数。如果是允许输入负整数或者输入小数,那就完全是另一道题了。  用int [100]这种类型存储输入数据显然是错误的,因为这最多可以存储50对数据,再多就出错了。所以
printf("plese input the number and end with 0 0\n");
for(i=1;;i+=2)
//输入相应数值
scanf("%d%d",&a[i-1],&a[i]);
if(a[i-1]==0 && a[i]==0)
显然是错误的。只能采用输入一组数据就处理一组数据的方案。例如象下面这样写:
int addend1,addend2;
while (scanf("%d%d",&addend1,&addend2),addend1!=0 || addend2!=0 )
//处理addend1,addend2
int Take_number(int x,int y);
int count(int x);
&  这个有些莫名其妙。把函数定义写在了前面,却又在main()中又写了函数类型声明,画蛇添足。应该把函数类型声明写在main()之外、之前,把函数定义放在main()后面。
for(i=1;a[i-1]!=0;i+=2)
for(j=1,temp=0;j&=(a[i-1]&a[i]?count(a[i-1]):count(a[i]));j++)
carry[j]=0;
if(carry[j-1])
//若前一位有进位,该位相加为9也有进位
if(Take_number(a[i-1],j)+Take_number(a[i],j)&=9)
carry[j]=1;
carry[j]=0;
if(Take_number(a[i-1],j)+Take_number(a[i],j)&=10)
//若前一位无进位,相加为10才有进位
carry[j]=1;
if(carry[j])
temp=temp+1;
printf("%d\n",temp);
  这个从结构上来说就不合理,main()中的代码写得太多太细了。从代码逻辑上看有几个明显的错误,就是在内层循环中的
if(carry[j-1])
  注意循环变量j的初值为1,而carry是一个没有初始化的局部auto数组,因此当j为1时carry[j-1]即carry[0]是垃圾值,所以这个if选择没有意义。显而易见,后面所有代码都是错误的。所以就不进一步分析了。
2 题目:小学生数学
3 很多小学生在学习加法时,发现&进位&特别容易出错。
4 你的任务是计算两个非负整数在相加时需要多少次进位。
5 你编制的程序应当可以连续处理多组数据,直到读到两个0(这是输入结束标记)。
6 样例:输入
16 作者:薛非
20 #include &stdio.h&
22 unsigned get_carry_times ( unsigned , unsigned );
24 int main( void )
unsigned addend1,addend2 ;
while ( puts("输入两个非负整数,0 0表示结束"),
scanf("%u%u",&addend1,&addend2),
addend1!=0u || addend2!=0u )
printf("%u\n", get_carry_times ( addend1 , addend2 ) );
38 unsigned get_carry_times ( unsigned a1 , unsigned a2 )
unsigned c_t = 0u ;//进位次数
unsigned c
= 0u ;//进位
c += a1 % 10u + a2 % 10u ;
if ( (c /= 10u) != 0u )
a1 /= 10u ;
a2 /= 10u ;
while ( a1 + a2 != 0u );
阅读(...) 评论()前文链接:
#include &stdio.h&#include &string.h&
int abs(int a)
return a&0?a:-a;
int gcd(int a,int b)
a^=b^=a^=b;
return b?gcd(b,a%b):a;
int main()
int a,b,c,d,temp,temp0,temp1;
while(scanf("%d/%d%c%d/%d",&a,&b,&op,&c,&d)!=EOF)
temp1=b*d/gcd(b,d);
if(op=='-')
temp0=a*temp1/b-c*temp1/d;
temp0=a*temp1/b+c*temp1/d;
temp=gcd(abs(temp0),temp1);
if(temp0&&temp1==1)
printf("%d\n",temp0);
else if(temp0)
printf("%d/%d\n",temp0,temp1);
printf("0\n");
  这是另一位初学者给出的代码。  这段代码貌似更简练一些,但也有很多毛病。
  总体结构上偷工减料,贪小便宜(省写函数类型声明),且次序不当(把main()放在后面)。&
#include &string.h&
&  这是有鱼没鱼先撒一网。实际上多余写这条,因为根本就没用。程序员应该知道什么叫Occam's razor:Plurality should not be posited without necessity.(拉丁文表述是:Pluralitas non est ponenda sine neccesitate.)。
int a,b,c,d,temp,temp0,temp1;
  a,b,c,d这几个标识符过于庸俗,不过考虑到直接来自于题目,似乎也不便深责。  temp,temp0,temp1实在是太差了,无厘头。而且完全不应该定义在这个位置,应该放在while的循环体内定义。&
&  这个没什么问题,op显然是operation的缩写。
while(scanf("%d/%d%c%d/%d",&a,&b,&op,&c,&d)!=EOF)
  这个scanf()函数调用的转换格式&&"%d/%d%c%d/%d",或者叫&匹配格式&设计得不好。
  如果要严格满足题目中&a, b, c, d是一个0-9的整数&的要求,这个格式应该写为"%1d/%1d%c%1d/%1d"。更投机取巧的写法可以把那个正负号视为c的一部分:"%1d/%1d%2d/%1d",但这仅仅在加减法时才适用,并不具备一般性。
  如果希望程序更&宽容&一些,比如能接受输入流中合情合理的空格,例如 1 / 8 + 3 / 8,这个转换格式应该设计为"%d / %d %c %d / %d"。
  对于"%d/%d%c%d/%d"来说, 1 / 8 + 3 / 8 这样的输入最多只能转换一个"%d",即正确输入那个1。而对于"%d / %d %c %d / %d"来说, 1 / 8 + 3 / 8这样的输入能完全地正确转换(甚至多加几个空白字符也没关系)。
  这是因为对于scanf()来说,转换格式中的空白字符(white-space character)的意义是读至第一个非white-space character。(A directive composed of white-space character(s) is executed by reading input up to the first non-white-space character (which remains unread), or until no more characters can be read. The directive nev er fails.)
  一般情况下,在scanf()的转换控制字符串中应该不写任何white-space character或非white-space character( ),但是凡事都有例外。
temp1=b*d/gcd(b,d);
急躁。急吼吼地就开始处理公共细节。
粗心。显然没考虑b或d为0的情况。
if(op=='-')
temp0=a*temp1/b-c*temp1/d;
temp0=a*temp1/b+c*temp1/d;
  显得有点笨重。要是我也许会这样写
if(op=='-')
temp0=a*temp1/b+c*temp1/d;
temp=gcd(abs(temp0),temp1);
  求绝对值这种小事情还是在gcd()函数定义内部完成为好。写在这里过于突出细节,影响主要思想的表达。&
if(temp0&&temp1==1)
printf("%d\n",temp0);
else if(temp0)
printf("%d/%d\n",temp0,temp1);
printf("0\n");
  这段代码显然应该抽象为一个函数,写在这里显得拖泥带水。&
&  这个奇葩。应该
int abs(int a)
return a&0?a:-a;
  这函数的名字显然有问题,不应该取这个名字,因为有一个库函数就是这个名字(声明于stdlib.h中)。当然这样用也不是不可以,但其中涉及到一系列复杂的语言规则。了解这个规则的人虽然知道自己的函数可以与库函数重名,但却从来不会这样用。我相信这位初学者是不知道这个规则的,他(她)这样写是瞎猫碰到死耗子而已。&
int gcd(int a,int b)
a^=b^=a^=b;
return b?gcd(b,a%b):a;
&  这个函数是错的。
a^=b^=a^=b;
  这里有两个问题。第一,a^=b^=a^=b这个表达式是未定义行为(参见,, )。第二,从后面的代码来看,这里根本就没必要给a、b排序。(参见拙著《品悟C》第五章 画蛇添足 问题12&不彻底的思考&,p152)
阅读(...) 评论()当前位置: >
> C语言新手,小弟我写了下面的程序,编译没错,执行就报错
C语言新手,小弟我写了下面的程序,编译没错,执行就报错
laner203 & at
C语言新手,我写了下面的程序,编译没错,执行就报错#include &stdio.h&#if(1)#include &string.h&char *strcat_(char *str1,char *str2,int str1L,int str2L);int main(int argv,char argc[]){ char str1[100],str2[100]; printf(&请输入第一个字符串:&); gets(str1); printf(&\n请输入第二个字符串:&); gets(str2); strcat_(str1,str2,strLen(str1),strLen(str2)); return 0;}char *strcat_(char *str1,char *str2,int str1L,int str2L){ int length = str1L + str2L + 1; printf(&------%d&,length); return &a&;}#endif编译的时候,提示:warning C4013: 'strLen' assuming extern returning int运行的时候,提示:test.obj : error LNK2001: unresolved external symbol _strLenDebug/Text.exe : fatal error LNK1120: 1 unresolved externals执行 link.exe 时出错-----------------------------------------------------我看了很久。不知道错在哪里?
strLen应该小写strlen
lanfanchuan1 & &
& & (0)(0)引用  C/C++ code  strcat_(str1,str2,strlen(str1),strlen(str2));
lanfan & &
& & (0)(0)引用strLen 改成 strlen& 你写错了,L写成大写了这个我改后编译运行,都正确
lanfeng197920 & &
& & (0)(0)引用关于自己是否适合编程的很简单的测试:在报纸或杂志上随便找一段约1000字的文章,在Word中输入一遍。输完后再参考下面答案:A里面有10处以上文字或标点错误B里面没有文字或标点错误并敢为此跟人打赌C里面没有文字或标点错误并且字体和排版完全与原稿一致D打印在半透明的纸上和原稿重叠在一起检查一模一样,且自我感觉很有成就感A不适合编程(理由:打字准确度偏低、粗心大意)B初级程序员(理由:打字准确度很高、认真细致、自信、理解全角半角概念)C高级程序员(理由:在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证)D软件项目经理(理由:能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业!)如果想从A变成B的话,到我的资源里面下载“适合程序员的键盘练习”lanfeng106 & &
& & (0)(0)引用
本问题标题:
本问题地址:
温馨提示:本问答中心的任何言论仅代表发言者个人的观点,与希赛网立场无关。请对您的言论负责,遵守中华人民共和国有关法律、法规。如果您的言论违反希赛网问答中心的规则,将会被删除。
暂无合适的专家
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&&&湘教QS2-164&&增值电信业务经营许可证湘B2-

我要回帖

更多关于 c语言在哪里运行 的文章

 

随机推荐