Вот очень большая проблема :
scanf("%s", &manOrFemale);
Переменная manOrFemale
представляет собой один символ.Формат "%s"
предназначен для чтения байтовых строк с нулевым символом в конце.
Строка, состоящая только из одного символа, требует пространства для двух символов, чтобы соответствовать нулевому ограничителю.Поскольку у вас нет места для терминатора, функция scanf
запишет в память, которой вы не владеете, что приведет к засорению стека (где компиляторы обычно хранят локальные переменные), что приведет к получаемой ошибке.
Если вы хотите прочитать один символ, а затем использовать формат "%c"
, как в
scanf(" %c", &manOrFemale);
Обратите внимание на начальный пробел в строке формата, необходимо игнорировать возможный начальный пробел (например, перевод строки)из любого предыдущего ввода).
Также обратите внимание, что при сравнении manOrFemale == "f"
вы сравниваете один символ в manOrFemale
со строкой "f"
.Литеральная строка в C на самом деле является массивом символов только для чтения, и, как и любой другой массив, она распадается на указатель на свой первый элемент.Таким образом, вы не сравниваете символы, вы сравниваете символ с указателем.
Ваш компилятор должен был предупредить вас об этом.
Чтобы решить эту проблему, необходимо сравнить с одним символом.вместо: manOrFemale == 'f'
.Обратите внимание на использование одинарных кавычек.
Наконец, более стилистическая заметка ...
Заявления
if (manOrFemale == 'f' && age <= 55)
{
printf("\nYou are a lady at her best!");
} else if (manOrFemale == 'f' && age >= 56)
{
printf("\nYou look young for your age!");
}
могут быть переписаны как
if (manOrFemale == 'f')
{
if (age <= 55)
printf("You are a lady at her best!\n");
else
printf("You look young for your age!\n");
}
Еще одна вещь, на которую следует обратить внимание, это то, что я использую трейлинг перевод строки в выводе.Это связано с тем, что в противном случае после завершения программы может отсутствовать символ новой строки (поэтому вывод кажется смешанным с приглашением командной строки), а также потому, что по умолчанию вывод stdout
(при записи printf
) линия буферизации .Буферизация строки означает, что вывод буферизуется внутренне и фактически не записывается в терминал до тех пор, пока либо не заполнится буфер, либо , либо не будет написана новая строка .Если в выходных данных вы используете начальные символы новой строки, будет записана предыдущая строка, а не текущая.