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引用,我没有包含在我的代码中。
答案 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");
}