开关盒操作员 - C.

时间:2010-09-06 12:03:28

标签: c switch-statement

有没有办法在一个操作中将用户输入存储在交换机案例中,并在运行时跨交换机操作使用它。

示例:如果它是银行的软件,我想从用户那里获取信息并验证他的账号是否正确,还要检查他是否有足够的银行余额来取款

我需要知道如何存储一个操作的值,以便我可以将它用于进一步的操作。

 switch(ops)
    {

                            char ac_no;
                            long amt,amt2,init_dep;
                            char name,ac_allocated;


            case OpenAC:
                    {
                            printf("1.Name:\n");
                            scanf("%s",&name);

                            printf("2.A/Cno_allocated:\n");
                            scanf("%s",&ac_allocated);

                            printf("3.Initial deposit:\n");
                            scanf("%d",&init_dep);
                            break;

                    }
            case Deposit:
                    {
                            printf("Enter the a/c number: ");
                            scanf("%s",&ac_no);

                            printf("Amount:Rs. ");
                            scanf("%ld",&amt);
                            break;

                    }
            case Withdraw:
                    {
                            printf("Enter the a/c number: ");
                            scanf("%s",&ac_no);

                            printf("Amount:Rs. ");
                            scanf("%ld",&amt2);


                  {printf("Cannot withdraw.Rs.500 minimum balance mandatory.\n");}

                            break;

                    }
            return ops;

    }

我还尝试在switch(ops)中声明变量以将值存储在其中(如下例所示,以便在下一步中验证a / c号,但它没有帮助。)

已编辑的代码:

`

                            char ac_no;

                            long amt,amt2,init_dep,dep1;

                            char name,ac_allocated,ac1;

               case OpenAC:
                    {
                            printf("1.Name:\n");
                            scanf("%s",&name);

                            printf("2.A/Cno_allocated:\n");
                            scanf("%s",&ac_allocated);

                            ac_allocated = ac1;

                            printf("3.Initial deposit:\n");
                            scanf("%d",&init_dep);
                            init_dep = dep1;

                            //break;

                    }
            case Deposit:
                    {
                            printf("Enter the a/c number: ");
                            scanf("%s",&ac_no);

                            if(ac_no == ac1)
                            {
                             printf("Amount:Rs. ");
                             scanf("%ld",&amt);
                            }

                            break;

`

4 个答案:

答案 0 :(得分:7)

为什么不在交换机外声明变量。您甚至可以在开关周围放置大括号以防止变量泄漏到周围的函数,如下所示:

// code from the surrounding function
{
char ac_no; 
long amt,amt2,init_dep; 
char name,ac_allocated; 

switch(ops) 
   { 
   case OpenAC: 
      ...
   }
} // end of block

答案 1 :(得分:3)

我不确定我是否理解你的问题,但是如果你在switch语句的大括号内声明了某些东西,那么当你点击结束的大括号时它将超出范围而在下次switch语句时不可用遇到。

答案 2 :(得分:2)

第一个问题:你为ac_no,name,ac_allocated和ac1使用了错误的类型。您显然希望在这些位置存储字符串,因此您需要声明char:

的数组,而不是普通的char
char ac_no[AC_NO_SIZE];
char name[NAME_SIZE];
char ac_allocated[AC_ALLOCATED_SIZE];
char ac1[AC1_SIZE];

其中每个*_SIZE足够大以容纳输入数据加上0终止符的1个额外字符。 IOW,如果您的帐号长度最多为10个字符,则AC_NO_SIZE必须为11.

第二个问题: not 在switch语句的开头声明变量;任何初始化都将被跳过。

第三个问题:在特定范围内声明的自动变量在该范围之外是不可用的;当该范围退出时,它们将不复存在。您声明的变量都不会在switch语句之外可用。

第四个问题:如果此开关操作在函数内部,并且您希望在函数调用之间保留这些值,则可以执行以下三个操作之一:

  • 在任何函数之外的文件范围内声明这些项目(不推荐):
    
    char ac_no[AC_NO_SIZE];
    char name[NAME_SIZE];
    char ac_allocated[AC_ALLOCATED_SIZE];
    char ac1[AC1_SIZE];
    long amt, amt2, init_dep;
    
    void foo()
    {
       int ops;
       ...
       ops = bar(ops);
       ...
    }
    
    int bar(int ops)
    {
      switch(ops)
      {
        case OpenAC:
          printf("Name: ");
          fflush(stdout);
          scanf("%s", name); // note no &; true for all char [] types
          printf("A/C no allocated: ");
          fflush(stdout);
          scanf("%s", ac_allocated);
          printf("Initial deposit: ");
          fflush(stdout);
          scanf("%ld", &init_dep);
          ...
      }
      return ops;
      ...
    
  • 在函数中将这些项声明为`static`(稍微不推荐);它们在函数外部不可见,但它们的值将在函数调用之间保留:
    
    int bar(int ops)
    {
      static char ac_no[AC_NO_SIZE];
      static char name[NAME_SIZE];
      static char ac_allocated[AC_ALLOCATED_SIZE];
      static char ac1[AC1_SIZE];
      static long amt, amt2, init_dep;
    
      switch(ops)
      {
        case OpenAC:
          printf("Name: ");
          fflush(stdout);
          scanf("%s", name);
          printf("A/C no allocated: ");
          fflush(stdout);
          scanf("%s", ac_allocated);
          printf("Initial deposit: ");
          fflush(stdout);
          scanf("%ld", &init_dep);
        ...
      }
      return ops;
    }
    
  • 在调用函数中声明这些项,并将它们作为参数传递给此函数(推荐):
    
    int foo(int ops, 
            char *ac_no, 
            char *name, 
            char *ac_allocated, 
            char *ac1, 
            long *amt,          // Since these values are being modified in the function,
            long *amt2,         // we must pass pointers to them, otherwise the changes
            long *init_dep)     // will not be reflected in the calling function
    {
      switch(ops)
      {
         case OpenAC:
           printf("Name: ");
           fflush(stdout);
           scanf("%s", name); // no & before name; same is true for rest of parameters
           printf("A/C no allocated: ");
           fflush(stdout);
           scanf("%s", ac_allocated);
           printf("Initial deposit: ");
           fflush(stdout);
           scanf("%ld", init_dep); // no & before init_dep since it's already a pointer
           ...
    

所有这些都假设我正确理解你的问题。

答案 3 :(得分:0)

也许您应该使用结构来保存帐户数据和功能,以使其可读和可维护。

struct account_s { /* Fields borrowed to @John Bode */
    char ac_no[AC_NO_SIZE];
    char name[NAME_SIZE];
    char ac_allocated[AC_ALLOCATED_SIZE];
    char ac1[AC1_SIZE];
    long amt, amt2, init_dep;
};

int openAC(struct account_s *account);

继续......:)