System.AccessViolationException错误c ++ VS 2010 Express(简易代码)

时间:2014-01-03 14:09:05

标签: c visual-studio-2010 runtime-error

每次我想运行此代码时,我都会收到来自VS c ++ 2010 Express的错误消息:

  

Eine nicht behandelte Ausnahme des Typs   Automat.exe aufgetreten中的“System.AccessViolationException”。

     

ZusätzlicheInformationen:Es wurde versucht,imgeschütztenSpeicher   zu lesen oder zu schreiben。 Dies ist haufig ein Hinweis darauf,dass   andererSpeicherbeschädigtist。

以下是使用Google翻译翻译为英语的错误消息:

  

“System.AccessViolationException”类型的未处理异常   '发生在Automat.exe。

     

附加信息:尝试读取或写入受保护的内存   是。这通常表明其他内存已损坏。

这是我的代码:

#include "stdafx.h"
#include <stdio.h>
#include <conio.h>

int main ()
{int g[5]={14,28,24,24,12},ag[3]={30,25,17},w[5]={0,0,0,0,0},a;
 float e,p[3]={1.2,1.0,0.95},s=0;
 while(1)
    {while(1)
        {printf("\n1)Drink1 1.2Euro");
         printf("\n2)Drink2 1Euro");
         printf("\n3)Drink3 0.95Euro");
         printf("\nWaehlen sie ein Getraenk aus:    ");
         scanf("%f",&a);
         if(a==123456)
             {printf("\nEs sind noch folgende Getraenke vorhanden:");
              printf("\n%dxDrink1\n%dxDrink2\n%dxDrink3",ag[0],ag[1],ag[2]);
              printf("\nEs ist noch folgendes Wechselgeld vorhanden:");
              printf("\n%fx1Euro\n%fx50Cent\n%fx20Cent\n%fx10Cent\n%fx5Cent\n",g[0],g[1],g[2],g[3],g[4]);
              break;
             }
         else
             {if(ag[a-1]==0)
                {printf("\n\nDas Ausgewaehlte Getraenk ist nicht mehr verfuegbar\n");
                }
              else
                {if(a==1 || a==2 || a==3)
                    {break;
                    }
                }
            }

         printf("\n\nIhr Auswahl ist ungueltig!\n");
        }
     a--;
     printf("\n\n Bitte werfen sie %.2f Euro ein\n",&p[a]);
     while(s<p[a])
        {while(1)
            {printf("\nDerzeit:   %f\nEinwurf:   \n",s);
             scanf("%f",&e);
             if(e==2 || e==1 || e==0.5 || e==0.2 || e==0.1 || e==0.05)
                {break;
                }
             printf("\nDer eingeworfene Wert ist ungueltig!\n");
            }
          s=s+e;
        }
     ag[a]--;
     s=s-p[a];
     if(s==0)
        {printf("\n\nGeniessen sie ihr Getraenk!\n");
        }
     else
        {printf("\nSie bekommen noch %f Euro\n",s);
         while(s-1>0)
            {w[0]++;
             s=s-1;
            }
         while(s-0.5>0)
            {w[1]++;
             s=s-0.5;
            }
         while(s-0.2>0)
            {w[2]++;
             s=s-0.2;
            }
         while(s-0.1>0)
            {w[3]++;
             s=s-0.1;
            }
         while(s-0.05>0)
            {w[4]++;
             s=s-0.05;
            }
         printf("\nIhr Wechselgeld:");
         printf("\n%fx1Euro\n%fx50Cent\n%fx20Cent\n%fx10Cent\n%fx5Cent",w[0],w[1],w[2],w[3],w[4]);
         printf("\n\nGeniessen sie ihr Getraenk!\n");
         g[0]=g[0]-w[0];
         g[1]=g[1]-w[1];
         g[2]=g[2]-w[2];
         g[3]=g[3]-w[3];
         g[4]=g[4]-w[4];
        }
    }


 getch(); 
 return 0; 
}

调试时我发现,当我输入123456时,它甚至不认为第一个语句(if(a == 123456))为真。

请帮忙。

1 个答案:

答案 0 :(得分:2)

您不应使用a格式说明符在scanf中读取整数(%f)。请改用%d