Программа C не выполняет printf в конце - PullRequest
0 голосов
/ 29 января 2019

Я просто делаю крошечное упражнение для школы и застрял с функцией scanf.
Если я запускаю этот код, вначале все работает нормально, но как только все 5 scanf сделаны, он просто перестает работать и выходит без печати этого printf в конце.Где проблема в этом?
Теперь вот код (я кодирую в visual studio 2017 для Windows 10):

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int main() {
    char name[50];
    char gender[1];
    float wage = 0;
    int age = 0;
    int height = 0;

    printf("\nInput Name: ");
    scanf(" %s", name);

    printf("\nInput Gender (m/f): ");
    scanf(" %c", &gender);

    printf("\nInput Monthly Wage: ");
    scanf(" %d", &wage);

    printf("\nInput Age: ");
    scanf(" %d", &age);

    printf("\nInput height in cm: ");
    scanf(" %d", &height);


    printf("\nNAME: %s\nGENDER: %c\nWAGE %d\AGE: %d\nSIZE: %d", name, gender, wage, age, height);

    return 0;
    getchar();
}

Ответы [ 3 ]

0 голосов
/ 29 января 2019

Есть некоторые проблемы, которые приводят к неопределенному поведению или «неожиданным» вещам, и вы должны получить предупреждения компилятора об этом (если нет, включите их).

Во-первых, следует определить genderкак char gender;, если вы хотите написать scanf(" %c", &gender); позже.

Во-вторых, wage имеет тип float такой, что scanf и printf требуют спецификатора формата %f (а не %d).

В-третьих, у вас есть«недостижимый код», поскольку ваш getchar идет после return 0 заявления.

В-четвертых, не ошибка / предупреждение, а просто замечание, printf может дождаться новой строки, прежде чем очистить свой буферна консоль.Так что пиши

char gender;
...
scanf(" %f", &wage);
...
printf("\nNAME: %s\nGENDER: %c\nWAGE %f\AGE: %d\nSIZE: %d\n", name, gender, wage, age, height);
...
getchar();
return 0;
0 голосов
/ 29 января 2019

Есть много проблем с вашим кодом, давайте обсудим их одну за другой:

Задача 1 :

scanf(" %c", &gender);

здесь вы используете &gender Это проблема.Вы объявили пол как массив символов, а не как переменную, поэтому в операторе scanf вы должны передать адрес первого элемента массива, поэтому вместо &gender просто используйте gender или &gender[0].Если вы не узнали об указателях и адресах, перейдите по этой ссылке: https://www.youtube.com/playlist?list=PL2_aWCzGMAwLZp6LMUKI3cc7pgGsasm2_

Кроме того, вы берете только один символ в качестве ввода, тогда вам не нужен массив для этого.Просто используйте char gender; вместо char gender[];

Задача 2 :

scanf(" %d", &wage);

Вы объявили заработную плату как float, поэтому используйте %f вместо %d.

Задача 3 :

printf("\nNAME: %s\nGENDER: %c\nWAGE %d\AGE: %d\nSIZE: %d", name, gender, wage, age, height);

При взгляде на %d\AGE

\A

появится предупреждение, как кажетсябыть неизвестной escape-последовательностью для компилятора.Это на самом деле опечатка на вашей стороне, которую вы пропустили \ n.

Так что, наконец, замените ваши проблемы следующими строками кода:

char gender;

scanf("%f", &wage);

printf("\nNAME: %s\nGENDER: %c\nWAGE %f\nAGE: %d\nSIZE: %d", name, gender, wage, age, height);
0 голосов
/ 29 января 2019

Есть несколько проблем с вашим кодом.

Несмотря на то, что пол был указан, простое решение - объявить его как переменную.

char gender;
... // Do stuff
scanf("%c", &gender);

Wage - это число с плавающей точкой, и, если вы не хотите объявить его как int, попробуйте

float wage;
... // Do stuff
scanf("%f", &wage); 

Наконец, в printf отсутствует правильная новая строка, но это может небыть проблемой.

Вместо

printf("\nNAME: %s\nGENDER: %c\nWAGE %d\AGE: %d\nSIZE: %d", name, gender, wage, age, height);

Попробуйте

printf("\nNAME: %s\nGENDER: %c\nWAGE %f\nAGE: %d\nSIZE: %d", name, gender, wage, age, height);

Кроме того, getchar() не будет иметь никакого эффекта, поскольку это происходит после возврата.что-нибудь после оператора return не будет иметь никакого эффекта.

Я вполне мог бы пропустить другие ошибки, но внесение предложенных изменений должно быть достаточным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...