2015-02-17 2 views
-5

Вот простое меню. Пользователю будет предложено выбрать число от 0 до 3. При выполнении этого, если бы я должен был ввести 1 в приглашении, он выдавал бы «Hello2», что является правильным. Тем не менее, в строке 9, когда предполагается вернуть значение 1 (ввод количества, сохраненный как переменная типа, возвращает 0. Он вернет 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");  
    }  
} 
+0

Чтобы избежать этой ошибки, используйте прототипы функций. Ваш код является незаконным на C99 (в котором функции должны быть объявлены как минимум до их использования). –

+0

Не игнорируйте возвращаемое значение 'scanf()'. –

+0

Включите предупреждения своего компилятора и обратите внимание на них. – 5gon12eder

ответ

1

type вы изменяете является локальной переменной в getInput Если вы хотите изменить глобальный один, удалите параметр функции:.

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) имеет неявный параметр типа int в c89, но недопустим от c99 года.

3

Во-первых, ваш код не подлежит компиляции на современном языке C. Функция getType не объявляется в точке вызова. Язык C не позволяет вам вызывать незаявленные функции.

Также этот

int getInput(type) 
{ 
    ... 

Является ли старый K & R-стиль определения функции, которая опирается на "неявное int" правила. У современного языка C больше нет «неявного int», поэтому ваш код недействителен.

Во-вторых, если ваш компилятор принимает вызов и определение R-стиля K &, он принимает его как код C89/90 с типом параметра по умолчанию int. Этот локальный параметр int type - это то, с чем вы работаете. Это никоим образом не связано с глобальной переменной type, которая остается 0 навсегда.

В-третьих, ваш код нарушен многими другими способами. Вы определили функцию getInput с параметром, но назовите ее без каких-либо аргументов. Это вызывает неопределенное поведение.

В-четвертых, в то время как не сразу появляется ошибка в C, ваш getInput объявляется возвращаемым int, но вы никогда ничего не возвращаете от него.

+1

Также 'int main (int argc)' не является допустимым объявлением для 'main' в C89. – ouah

Смежные вопросы