1、上面那个回答返回的返回值结构体是在栈上的,fun函数返回后已被销毁,是无效地址
2、上面那个回答没有检查输入字符的合法性
3、上面那个回答有部分语法不符合c规范,比如变量不是在函数开始声明
4、上面那个回答的str_result,每次调用fun都会分配一个,又没有释放,存在内存泄漏
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
typedef struct
{
char str_result[20]
float f_result
int i_result
}RESULT
void fun(char* s, RESULT* re)
{
int len=strlen(s) //获取字符串长度
int i,dot=0 //dot: 字符串中有几个小数点dot等于几,如果大于1则返回报错信息
for(i=0i<leni++)
{
if(s[i]=='.')
{
dot++
if(dot>1) //如果有多个小数点
{
strcpy(re->str_result,"an error!")
re->f_result=0.0
re->i_result=0
return
}
}
else if ( '-' == s[i] )
{
}
else if ( '0' > s[i] || '9' < s[i] )
{
strcpy(re->str_result,"an error!")
re->f_result=0.0
re->i_result=0
return
}
}
if(dot==0) //如果没有小数点, 则返回整数
{
strcpy(re->str_result,"整数")
re->i_result=atoi(s)
re->f_result=0.0
return
}
else if(dot==1) //如果只有一个小数点, 则返回float
{
strcpy(re->str_result,"浮点数")
re->f_result=atof(s)
re->i_result=0
return
}
}
int main(int argc, char *argv[])
{
RESULT re //定义一个返回值结构体
char s[10]={'\0'}
char sel
while(1)
{
fflush(stdin)
scanf("%s",s)
fun(s, &re)
if(strcmp(re.str_result,"an error!")==0) //如果返回的信息为错误, 则打印报错字符串
{
printf("\nan error!")
}
else if(strcmp(re.str_result,"浮点数")==0) //如果返回的信息为浮点数
{
printf("\n%f",re.f_result)
}
else //如果返回的信息为整数
{
printf("\n%d",re.i_result)
}
printf("\n\n继续?[y/n]: ")
fflush(stdin)
scanf("%c",&sel)
if(sel=='y' || sel=='Y')
{
continue
}
break
}
return 0
}
黑白棋游戏#include"graphics.h"/*图形系统头文件*/#defineLEFT0x4b00/*光标左键值*/#defineRIGHT0x4d00/*光标右键值*/#defineDOWN0x5000/*光标下键值*/#defineUP0x4800/*光标上键值*/#defineESC0x011b/*ESC键值*/#defineENTER0x1c0d/*回车键值*/inta[8][8]={0},key,score1,score2/*具体分数以及按键与存放棋子的变量*/charplayone[3],playtwo[3]/*两个人的得分转换成字符串输出*/voidplaytoplay(void)/*人人对战函数*/voidDrawQp(void)/*画棋盘函数*/voidSetPlayColor(intx)/*设置棋子第一次的颜色*/voidMoveColor(intx,inty)/*恢复原来棋盘状态*/intQpChange(intx,inty,intz)/*判断棋盘的变化*/voidDoScore(void)/*处理分数*/voidPrintScore(intn)/*输出成绩*/voidplayWin(void)/*输出胜利者信息*//******主函数*********/voidmain(void){intgd=DETECT,grinitgraph(&gd,&gr,"c:\\tc")/*初始化图形系统*/DrawQp()/*画棋盘*/playtoplay()/*人人对战*/getch()closegraph()/*关闭图形系统*/}voidDrawQp()/*画棋盘*/{inti,jscore1=score2=0/*棋手一开始得分都为0*/setbkcolor(BLUE)for(i=100i=64-score1-score2)/*如果尝试超过空格数则停步*/{MoveColor(x,y)fillellipse(x,y,15,15)break}elsecontinue/*如果按键无效*/}DoScore()/*分数的改变*/break/*棋盘变化了,则轮对方走棋*/}else/*已经有棋子就继续按键*/continue}else/*四个方向按键的判断*/if(key==LEFT&&x>120)/*左方向键*/{MoveColor(x,y)fillellipse(x,y,15,15)SetPlayColor(t)x-=40fillellipse(x,y,15,15)}elseif(key==RIGHT&&x80)/*右方向键*/{MoveColor(x,y)fillellipse(x,y,15,15)SetPlayColor(t)x+=40fillellipse(x,y,15,15)}elseif(key==UP&&y>120)/*上方向键*/{MoveColor(x,y)fillellipse(x,y,15,15)SetPlayColor(t)y-=40fillellipse(x,y,15,15)}elseif(key==DOWN&&y1)/*判断左边*/{for(k=j-1k>=0k--)if(a[i][k]==a[i][j]||!a[i][k])breakif(a[i][k]!=0&&k>=0){for(kk=j-1kk>k&&k>=0kk--){a[i][kk]=a[i][j]fillellipse(120+i*40,120+kk*40,15,15)}if(kk!=j-1)yes=1}}if(i1)/*判断上边*/{for(k=i-1k>=0k--)if(a[k][j]==a[i][j]||!a[k][j])breakif(a[k][j]!=0&&k>=0){for(kk=i-1kk>k&&k>=0kk--){a[kk][j]=a[i][j]fillellipse(120+kk*40,120+j*40,15,15)}if(kk!=i-1)yes=1}}if(i>1&&j=0&&kk=0&&kkk&&k>=0ii--,jj++){a[ii][jj]=a[i][j]fillellipse(120+ii*40,120+jj*40,15,15)}if(ii!=i-1)yes=1}}if(i1)/*左下*/{for(k=i+1,kk=j-1k=0k++,kk--)if(a[k][kk]==a[i][j]||!a[k][kk])breakif(a[k][kk]!=0&&k=0){for(ii=i+1,jj=j-1ii1&&j>1)/*左上*/{for(k=i-1,kk=j-1k>=0&&kk>=0k--,kk--)if(a[k][kk]==a[i][j]||!a[k][kk])breakif(a[k][kk]!=0&&k>=0&&kk>=0){for(ii=i-1,jj=j-1ii>k&&k>=0ii--,jj--){a[ii][jj]=a[i][j]fillellipse(120+ii*40,120+jj*40,15,15)}if(ii!=i-1)yes=1}}if(iscore1)/*开始判断最后的结果*/outtextxy(100,50,"blackwin!")elseif(score2#include#include#include#include#defineLEFT0x4b00#defineRIGHT0x4d00#defineDOWN0x5000#defineUP0x4800#defineESC0x011b#defineSPACE0x3920#defineBILI20#defineJZ4#defineJS3#defineN19intbox[N][N]intstep_x,step_yintkeyintflag=1voiddraw_box()voiddraw_cicle(intx,inty,intcolor)voidchange()voidjudgewho(intx,inty)voidjudgekey()intjudgeresult(intx,inty)voidattentoin()voidattention(){charchwindow(1,1,80,25)textbackground(LIGHTBLUE)textcolor(YELLOW)clrscr()gotoxy(15,2)printf("游戏操作规则:")gotoxy(15,4)printf("PlayRules:")gotoxy(15,6)printf("1、按左右上下方向键移动棋子")gotoxy(15,8)printf("1.PressLeft,Right,Up,DownKeytomovePiece")gotoxy(15,10)printf("2、按空格确定落棋子")gotoxy(15,12)printf("2.PressSpacetoplacethePiece")gotoxy(15,14)printf("3、禁止在棋盘外按空格")gotoxy(15,16)printf("3.DONOTpressSpaceoutsideofthechessboard")gotoxy(15,18)printf("你是否接受上述的游戏规则(Y/N)")gotoxy(15,20)printf("DoyouaccepttheabovePlayingRules?[Y/N]:")while(1){gotoxy(60,20)ch=getche()if(ch=='Y'||ch=='y')breakelseif(ch=='N'||ch=='n'){window(1,1,80,25)textbackground(BLACK)textcolor(LIGHTGRAY)clrscr()exit(0)}gotoxy(51,12)printf("")}}voiddraw_box(){intx1,x2,y1,y2setbkcolor(LIGHTBLUE)setcolor(YELLOW)gotoxy(7,2)printf("Left,Right,Up,DownKEYtomove,Spacetoput,ESC-quit.")for(x1=1,y1=1,y2=18x1=1i--)if(box[i][j]==0){draw_circle(step_x,step_y,LIGHTBLUE)break}if(i18)breakelse{for(i=step_x+1,j=step_yi18)breakstep_x=ijudgewho(step_x,step_y)break}caseDOWN:if((step_y+1)>18)breakelse{for(i=step_x,j=step_y+1j18)breakstep_y=jjudgewho(step_x,step_y)break}caseUP:if((step_y-1)=1j--)if(box[i][j]==0){draw_circle(step_x,step_y,LIGHTBLUE)break}if(j=1&&step_x=1&&step_y=1j--){if(box[j][k]==flag)n1++elsebreak}/*水平向右数*/for(j=x,k=yj=5){return(1)break}/*垂直向上数*/n1=0n2=0for(j=x,k=yk>=1k--){if(box[j][k]==flag)n1++elsebreak}/*垂直向下数*/for(j=x,k=yk=5){return(1)break}/*向左上方数*/n1=0n2=0for(j=x,k=yj>=1,k>=1j--,k--){if(box[j][k]==flag)n1++elsebreak}/*向右下方数*/for(j=x,k=yj=5){return(1)break}/*向右上方数*/n1=0n2=0for(j=x,k=yj=1j++,k--){if(box[j][k]==flag)n1++elsebreak}/*向左下方数*/for(j=x,k=yj>=1,k=5){return(1)break}return(0)break}}voidmain(){intgdriver=VGA,gmode=VGAHIclrscr()attention()initgraph(&gdriver,&gmode,"c:\\tc")/*setwritemode(XOR_PUT)*/flag=1draw_box()do{step_x=0step_y=0/*draw_circle(step_x,step_y,8)*/judgewho(step_x-1,step_y-1)do{while(bioskey(1)==0)key=bioskey(0)judgekey()}while(key!=SPACE&&key!=ESC)}while(key!=ESC)closegraph()}