2017-02-19 1 views
1

저는 C 프로그래밍을 처음 접했습니다. 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; 
} 

그러나 출력은 무엇입니까이 적절한 형식이 아닌를, 예를 들어, 나는 "2016년 10월 12일"를 입력하지만 얻는 결과는 "10-554502544-했다 32766 ". 어떤 생각이야? 미리 감사드립니다.

+0

* 2016년 10월 12일을 ""내가 입력 ""* - 당신의 형식 문자열과 일치하지 않는다. 현재 검사하지 않는'scanf'의 결과는 당신의 인수들 중 하나만 성공적으로 파싱되었다고 말할 것입니다. – WhozCraig

답변

1

scanf()은 꽤 힘든 도구입니다. 그것은 당신이 지정한 것과 정확히 일치하는 형식을 기대하며, 그렇지 않다면 이상한 행동을합니다.

텍스트를 정확하게 입력하거나 (dd/mm/yy가 아닌 dd-mm-yy) 텍스트를 입력하거나 사물에 대한 이동 방법을 변경해야합니다.

scanf() 문자열을 스캔하면 원하는 값을 얻을 수 있습니다. 입력의 분산에 훨씬 더 관대 할 수있을뿐만 아니라 프로그램을 중단하려는 사람에 대해 더 많은 증거가 될 수 있습니다 의도적으로 잘못된 입력을 제공합니다.

+0

감사합니다. caleb .. 내 문제를 해결했습니다. – blackdaemon

2

scanf()에는 %d/%d/%d의 형식이 있지만 입력을 10-12-2016으로 지정하면 잘못된 결과를 초래할 수 있습니다.

대신 입력을 -으로 지정하고 %d/%d/%d 부분의 scanf()은 입력에서 / 부분을 무시합니다.

10-12-2016을 입력했지만 결과는 10-554502544-32766입니다. 어떤 생각이야?

예, scanf()10date에 변수가 있지만 다른 변수에 어떤 값을 할당, 입력으로 10-12-2016주고있다. 다른 두 변수 monthyear은 초기화되지 않으므로 변수 monthyear의 값을 인쇄하면 가비지 값 (554502544 및 32766)이 표시됩니다.

이 방법을 확인하는 한 가지 방법은 변수를 초기화 한 다음 입력을받는 것입니다. 당신이 입력으로 10-12-2016을 주면

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

이제, 당신은 출력으로 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

관련 문제