修复C开关语句功能溢出?

时间:2018-04-30 23:54:08

标签: c switch-statement

   int main (void)
   {
    */ function prototypes */
    print_case();
    do_something1();
    do_something2();
    do_something3();
    do_something4(); 
    exit_program();
    program_invalid();
    }

    void print_case (void)  
   {  
    int i; 

    printf("\n"
           "1. Do Something 1\n"
           "2. Do Something 2\n"
           "3. Do Something 3\n"
           "4. Do Something 4\n"
           "5. Exit the program\n"
           "Enter choice (number between 1-5)>\n");
    scanf("%d", &i); 

    switch(i)
    {
    case 1:
        do_something1();
        break;
    case 2:
        do_something2();
        break;
    case 3:
        do_something3();       
        break;
    case 4:
        do_something4();       
        break;
    case 5:
        exit_program(); 
        break;
    default:
        program_invalid();
        break;
    }

    return;

}

something_t do_something1(void)
{
    something_t something;
    printf("Something 1\n");    
    return something;
}

void do_something2(something_t something)
{
    printf("Something 2\n");
}

void do_something3()
{
    printf("Something 3\n");
}

void do_something4()
{
    printf("Something 4\n");
}

void exit_program (void) 
{
    exit(0);
}

void program_invalid (void)
{
    printf("Not valid choice");
}

所以基本上当我编译它并执行代码并选择各种情况时,它会一次执行多个函数并一次打印出多个语句。让我们说我选择案例1它打印输出的东西1但是当我选择案例2它打印  东西1  东西2

当我选择案例3时,它会打印出来   东西1   东西2   东西3

那么如何修复我的代码以摆脱循环?我认为break语句只允许它一次执行一个函数。是的,我的typedef结构的something_t引用,我没有包含在我的代码中。

3 个答案:

答案 0 :(得分:2)

print_case()有开关。它做了它的事情然后返回。您认为main()中的函数原型实际上只是调用。所以它称之为。所以你看到所有的功能都在执行。 C习惯于耸肩并使其发挥作用,因为传统上它非常宽容。将你的'原型'移到main()之前,最好在它们上面加上适当的签名。

你的do_something2有一个arg,但是你没有在(非工作)假原型中声明它 - 也就是说,一旦你把它移到main()之前它就会不正确。

另外,既然你声明了do_something2()来取一个arg,你最好传递一个!

答案 1 :(得分:0)

为什么要将something_t作为输入添加到您的函数中。您发布的代码也无法编译。

你的名字也有缺口,缺少函数的函数类型something_t do_something1(void)。

答案 2 :(得分:0)

以下是代码的干净版本,我想这可能会帮助您记住一些内容。

#include <stdio.h>
#include <stdlib.h> // for exit.
#define True 1 // Symbolic constants.
/*
 * This is a multi-line comment.
 * -----------------------------
 *  These is how a function prototype
 *  should be.
 *  You can leave the parameter names
 *  empty because in function prototypes
 *  the parameter names are dumy but not
 *  the types.
 */
 typedef int something_t; // You can have any structure here.
                          // just for an example.
 void print_case(void);
 something_t do_something1(void);
 void do_something2(something_t);
 void do_something3(void);
 void do_something4(void);
 void exit_program (void);
 void program_invalid (void);
 // ---- This is a single line comment.

 int main()
 {
   while(True) {
   print_case();
   }
   return 0;
 }

void print_case (void)
{
 int i;

 printf("\n"
       "1. Do Something 1\n"
       "2. Do Something 2\n"
       "3. Do Something 3\n"
       "4. Do Something 4\n"
       "5. Exit the program\n"
       "Enter choice (number between 1-5)>\n");
 scanf("%d", &i);

 switch(i) {
 case 1:
     do_something1();
     break;
 case 2:
     do_something2(True); // must pass your struct.
     break;
 case 3:
     do_something3();
     break;
 case 4:
     do_something4();
     break;
 case 5:
     exit_program();
     break;
 default:
     program_invalid();
     break;
 }

 return;

}

something_t do_something1(void)
{
    something_t something;
    printf("Something 1\n");
    return something;
}

void do_something2(something_t something)
{
    printf("Something 2\n");
}

void do_something3(void)
{
    printf("Something 3\n");
}

void do_something4(void)
{
    printf("Something 4\n");
}

void exit_program (void)
{
    exit(0);
}

void program_invalid (void)
{
    printf("Not valid choice");
}