2017-02-19 28 views
1

Я очень новичок в программировании на С. Я пытался использовать функцию scanf, чтобы попросить пользователя ввести дату и отобразить ее на консоли. Так написал следующие коды:Как напечатать заданную дату в C

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

int main() { 
    int date, month, year; 
    printf("Please enter the date in the form of dd/mm/yyyy: "); 
    scanf("%d/%d/%d", &date, &month, &year); 

    printf("the date you entered was: %d-%d-%d\n", date, month, year); 
    return 0; 
} 

Но выход я получаю не в нужном формате, например, я типа в «10-12-2016», но результат я был «10-554502544- 32766" . Есть идеи, ребята? Заранее спасибо.

+0

* «я типа в„10-12-2016“» * - который не совпадает с форматной строки. Результат 'scanf', который вы сейчас не проверяете, сказал бы вам, что только один из ваших аргументов был успешно проанализирован. – WhozCraig

ответ

1

scanf() - довольно пухлый инструмент. Он ожидает, что формат будет точно таким, как вы указали, и если это не странное поведение.

Вам нужно либо ввести текст в точности так, как указано (dd/mm/yy, а не dd-mm-yy), или изменить, как вы идете о вещах.

Рассмотрите наличие scanf() сканирование в строке, которую вы затем лексируете сами, чтобы получить нужные значения - вы можете быть гораздо более терпимы к отклонениям ввода таким образом, а также быть более стойкими против кого-то, пытающегося сломать вашу программу путем преднамеренного ввода недействительных данных.

+0

Спасибо большое caleb .. Он решил мою проблему. – blackdaemon

2

В вашем scanf() у вас есть такой формат - %d/%d/%d, но вы даете ввод как 10-12-2016, так что вы ошибаетесь!

Вместо этого, вы должны внести свой вклад в - 10/12/2016 и %d/%d/%d части в scanf() проигнорирует / части от входа.

Я печатаю 10-12-2016, но в результате получается 10-554502544-32766. Есть идеи, ребята?

Да, когда вы даете 10-12-2016 в качестве входных данных, scanf() назначая только 10 к date переменной, но никакой ценности для других переменных. Поскольку две другие переменные month и year неинициализированы, вы получаете значение мусора (554502544 и 32766), когда вы печатаете значение переменной month и year.

Один из способов проверить это: просто инициализируйте переменную, а затем введите ввод.

int date = 0, month = 0, year = 0; 
scanf("%d/%d/%d", &date, &month, &year); 

Теперь, если вы даете 10-12-2016 в качестве входных данных, вы получите 10-0-0 в качестве вывода. Надеюсь, вы поймете, что на самом деле происходит!

+1

В качестве альтернативы, ''% d% * c% d% * c% d "', который принимает * любой * нецифровой символ, разделяющий три целочисленных значения. Или ''% d% * [/ -]% d% * [/ -]% d "', что позволило бы только '/' или '-' как числовые разделители (которые все еще могут быть смешаны или сопоставлены). И как всегда, нужно проверить результат 'scanf', чтобы все ожидаемые аргументы были успешно заполнены. – WhozCraig

+0

Спасибо большое Wasi – blackdaemon

+0

@WhozCraig Сэр, мне нужно поговорить с тобой, можем ли мы пообщаться? –

0
#include <stdio.h> 
#include <stdlib.h> 

int main() { 
    int date, month, year; 
    printf("Please enter the date in the form of dd press enter then enter mm then press enter then enter year then press enter.. "); 
    scanf("%d", &date); 
    scanf("%d", &month); 
    scanf("%d", &year); 
    printf("the date you entered was: %d/%d/%d\n", date, month, year); 
    return 0; 
} 
+0

В то время как действительный метод, не решает его проблему или не отвечает, почему у него возникла проблема. – Caleb

+0

, который является простым решением нового пользователя c –

+0

Он хочет иметь возможность вводить в качестве отдельной строки, не требуя нажатия ввода после каждой части даты. – Caleb

1

Вы должны проверить возвращаемое значение из scanf - See the manual page

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

int main() { 
    int date, month, year; 
    printf("Please enter the date in the form of dd/mm/yyyy: "); 
    if (scanf("%d/%d/%d", &date, &month, &year) == 3) { 
     printf("the date you entered was: %d-%d-%d\n", date, month, year); 
    } else { 
     printf("You have made an error\n"); 
    } 
    return 0; 
} 
+0

Большое спасибо Ed – blackdaemon

+0

Извините Ed, whats 'if (scanf ("% d /% d /% d ", & date, & month, & year) == 3)' означает? – blackdaemon

+0

Любая идея об этом 3 Ed? – blackdaemon