为什么这个开关盒总是返回0?

时间:2015-02-17 22:12:36

标签: c switch-statement

这是一个简单的菜单。提示用户选择0到3之间的数字。运行此时,如果我在提示符处输入1,则输出“Hello2”,这是正确的。但是,在第9行,当它应该返回值1(输入的数字作为'type'变量存储时,它返回0.对于输入的任何值,它将返回0.有人可以告诉我我在哪里出错了谢谢。

#include <stdio.h>

int type;

int main(int argc)
{
    int a = 7;
    getInput();
    printf("You selected: %d\n", type);
}    

int getInput(type)
{
    printf("\nPlease select an option:\n1)Create a record\n2)Display records\n
             3)Update records\n4)Exit\n\n;");
    scanf("%d", &type); 

    switch(type)
    {
        case 0:
        printf("Hello\n");
        break;
        case 1:
        printf("Hello2\n");
        break;
        case 2:
        printf("Case3\n");
        break;
        case 3:
        printf("Exit\n");
        break;
        default:
        printf("\nERROR! Please select a valid number\n");    
    }    
}

2 个答案:

答案 0 :(得分:3)

首先,您的代码在现代C语言中无法编译。函数getType未在调用时声明。 C语言不允许您调用未声明的函数。

也是这个

int getInput(type)
{
   ...

是旧的K&amp; R风格的函数定义,它依赖于&#34;隐式int&#34;规则。现代C语言没有&#34;隐含int&#34;规则不再,这就是你的代码无效的原因。

其次,如果编译器接受调用和K&amp; R风格的定义,它会将其接受为C89 / 90代码,参数类型默认为int。您正在使用此本地参数int type。它与全局变量type没有任何关系,它永远保持0

第三,您的代码在许多其他方面被破坏了。您使用参数定义了函数getInput,但是在没有任何参数的情况下调用它。这会导致未定义的行为。

第四,虽然C中没有立即出现错误,但您的getInput被声明为返回int,但您永远不会从中返回任何内容。

答案 1 :(得分:1)

您要修改的typegetInput中的局部变量。如果要修改全局参数,请删除函数参数:

int getInput(void) { .... }

还要确保从getInput返回内容,或者返回void类型的内容:

void getInput(void) { .... }

一个好的解决方案是删除全局变量并从函数返回type。解决这个问题和其他问题:

int getInput(void)
{
  int type = 0;
  /* 
     as before 
  */

  return type;
}

#include <stdio.h>

int main(void)
{
    int a = getInput();
    printf("You selected: %d\n", a);
}

注意函数签名int getType(type)在c89中具有隐式参数类型int,但从c99开始无效。