2015-10-11 1 views
0

Я пытаюсь выполнить условный и if-else цикл по этой проблеме, однако моя основная функция не выполняет шаги в том порядке, который я намеревался.Как выполнить функцию «Главная» в правильном порядке?

#include<stdio.h> 
    void draft(int, char); 
    void main() 
    { 
     int age = 0; 
     char sex; 
     printf("How old are you?"); 
     scanf_s("%d", &age); 
     printf("Please enter your sex.(M or F)"); 
     scanf_s("%c", &sex); 
     draft(age,sex); 
     system("pause"); 
     return; 
    } 
    void draft(int age,char sex) 
    { 
     if (age>= 21 && sex=="M") 
     { 
      printf("Congratulations son, You will be going off to Syria to fight for your country.\n"); 
     } 
     else if (age >= 18 && sex == "M") 
     { 
      printf("Congratulations son, You will be going off to Vietnam to fight for your country.\n"); 
     } 
     else if (age < 18 && sex == "M") 
     { 
      printf("Sorry Son you're still too young.\n"); 
     } 
     else if (age >= 21 && sex == "F") 
     { 
      printf("Sorry,miss, only men can serve.\n"); 
     } 
     else if (age >= 18 && sex == "F") 
     { 
      printf("Sorry,little lady, only men can serve.\n"); 
     } 
     else if (age < 18 && sex == "F") 
     { 
      printf("Sorry,little girl, only men can serve.\n"); 
     } 
     else 
     { 
      printf("Please enter age and sex."); 
     } 
     return; 
    } 

Пользователь предлагается для своего возраста, но после этого вводится он будет идти непосредственно к последнему ELSE оператору функции «проект», не давая пользователю возможность ввести пол.

+1

Я не вижу, как это может произойти на основе кода здесь. Шаг за строкой в ​​отладчике. –

+0

@EricJ .: Я думаю, вы не видели 'scanf_s («% c », &sex);'? – EOF

+0

Что произойдет, если вы просто используете 'scanf'? –

ответ

1

Проблема в том, что вы используете scanf для анализа ввода из stdin. Однако это просто рассматривает его как поток. Ваша программа действительно работает, если вы вводите что-то вроде 32F на первом входе.

[Изменить для наглядности: программа на самом деле не прыгает, что происходит, так это то, что второй scanf немедленно возвращает данные из stdin, которые не были прочитаны с первого. В этом случае это символ возврата, когда пользователь нажал клавишу ввода. Таким образом, он немедленно возвращается со значением, которое не является вашим «M» или «F», поэтому оно запускает окончательное другое. Происходит «небытие порядка»

Примечание: в вашей функции draft() есть вторая проблема. Вы используете "M" и "F", которые являются строками (массивами символов), тогда как вам действительно нужно использовать 'M' и 'F', которые являются одиночными символами.

То, что вы хотите, это прочитать одну строку и разобрать ее за раз. Поэтому я предлагаю следующее изменение. Я заменил scanfs на fgets, который будет читать одну строку. Затем используйте sscanf для разбора этой строки.

#include<stdio.h> 

void draft(int, char); 
int main() 
{ 
    int age = 0; 
    char sex; 
    char line[100] = {0}; 

    printf("How old are you?"); 
    fgets(line, sizeof(line), stdin); 
    sscanf(line, "%d", &age); 
    printf("Please enter your sex.(M or F)"); 
    fgets(line, sizeof(line), stdin); 
    sscanf(line, "%c", &sex); 
    draft(age,sex); 

    return 0; 
} 
void draft(int age,char sex) 
{ 
    if (age>= 21 && sex=='M') 
    { 
     printf("Congratulations son, You will be going off to Syria to fight for your country.\n"); 
    } 
    else if (age >= 18 && sex == 'M') 
    { 
     printf("Congratulations son, You will be going off to Vietnam to fight for your country.\n"); 
    } 
    else if (age < 18 && sex == 'M') 
    { 
     printf("Sorry Son you're still too young.\n"); 
    } 
    else if (age >= 21 && sex == 'F') 
    { 
     printf("Sorry,miss, only men can serve.\n"); 
    } 
    else if (age >= 18 && sex == 'F') 
    { 
     printf("Sorry,little lady, only men can serve.\n"); 
    } 
    else if (age < 18 && sex == 'F') 
    { 
     printf("Sorry,little girl, only men can serve.\n"); 
    } 
    else 
    { 
     printf("Please enter age and sex."); 
    } 
    return; 
} 
+1

№. Даже не начинайте с 'gets () '. Это устарело по уважительным причинам.Кроме того, если вы работаете' draft() ', вы должны, вероятно, также внести необходимые изменения. – EOF

+1

@EOF:' get' не просто устарел, а на 2011 ISO C-стандарт, он полностью удален из языка. И я согласен: даже не предлагаю использовать 'gets'. –

+0

Я отредактировал его, чтобы использовать' fgets'. Я просто использовал 'gets' как самую простую вещь, чтобы получить его для работы. – waterjuice

1

два вопроса:

После первого вызова scanf_s, символ новой строки остается в буфере. Эта новая линия сразу же поднимается вторым scanf_s. Вам нужно изменить шаблон для соответствия и отказаться от любых новых строк, помещая пробел до %d и %c. Кроме того, вы должны проверить возвращаемое значение, чтобы убедиться, что значение соответствия шаблона читалось:

printf("How old are you?"); 
if (scanf_s(" %d", &age) != 1) { 
    printf("You must enter a value age.\n"); 
    exit(1); 
} 
printf("Please enter your sex.(M or F)"); 
if (scanf_s(" %c", &sex) != 1) { 
    printf("You must enter a value age.\n"); 
    exit(1); 
} 

В draft, вы используете двойные кавычки вместо одинарных кавычек для символьного литерала:

if (age>= 21 && sex=="M") 

Здесь "M" - это строка, содержащая один символ плюс NULL-терминатор. Что вы хотите 'M', который является символом M. Таким образом изменить эту строку на:

if (age>= 21 && sex=='M') 

И сделать аналогичное исправление пяти других линий с той же проблемой.

0

Ну, это проблема:

scanf_s("%c", &sex); 

В отличие от конверсионных спецификаторов как %s и %d, то %c спецификатор не вызывает scanf (и, я предполагаю, scanf_s), чтобы пропустить любой ведущие пробелы в входной поток. Таким образом, он сразу же берет символ новой строки после вашего первого ввода, поэтому он не ждет, пока вы войдете в секс.

Чтобы исправить это, поставить пробел перед спецификатором преобразования:

scanf_s(" %c", &sex); 

Другая проблема заключается в ваши сравнения sex == "M" и sex == "F"; sex - это один char, но "M" и "F" - знак строки. Используйте сравнения sex == 'M' и sex == 'F' (одинарные кавычки, а не двойные кавычки).