C语言小程序

Python033

C语言小程序,第1张

代码如下,相对前面那个回答,主要改进了几点:

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()}