2014-05-18 4 views
1

주어진 날짜에 해당 날짜를 인쇄해야합니다. 예를 들어 출력이 18 5 2014 인 경우 출력은 일요일이어야합니다. 이 같은 내 프로그램 작성 :쉘 스크립트를 사용하여 주어진 날짜의 c 날짜 인쇄.

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

int main() 
{ 
    int d,m,y ; 
    char command[20]; 

    printf("Enter d: "); 
    scanf("%d",&d); 
    printf("Enter m: "); 
    scanf("%d",&m); 
    printf("Enter y: "); 
    scanf("%d",&y); 

    sprintf(command , "date -d %d/%d/%d | cut -b 1-3 ",m,d,y); 

    system(command) ; 
    return 0 ; 
} 

을하지만 출력은 조금 무섭다 :

Sat 
*** stack smashing detected ***: ./a.out terminated 
======= Backtrace: ========= 
/lib/x86_64-linux-gnu/libc.so.6(__fortify_fail+0x37)[0x7fd1e8d89f47] 
/lib/x86_64-linux-gnu/libc.so.6(__fortify_fail+0x0)[0x7fd1e8d89f10] 
./a.out[0x400743] 
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed)[0x7fd1e8ca076d] 
./a.out[0x4005a9] 
======= Memory map: ======== 
00400000-00401000 r-xp 00000000 08:05 21758155       /home/shahjahan/a.out 
00600000-00601000 r--p 00000000 08:05 21758155       /home/shahjahan/a.out 
00601000-00602000 rw-p 00001000 08:05 21758155       /home/shahjahan/a.out 
0240d000-0242e000 rw-p 00000000 00:00 0         [heap] 
7fd1e8a69000-7fd1e8a7e000 r-xp 00000000 08:05 790189      /lib/x86_64-linux-gnu/libgcc_s.so.1 
7fd1e8a7e000-7fd1e8c7d000 ---p 00015000 08:05 790189      /lib/x86_64-linux-gnu/libgcc_s.so.1 
7fd1e8c7d000-7fd1e8c7e000 r--p 00014000 08:05 790189      /lib/x86_64-linux-gnu/libgcc_s.so.1 
7fd1e8c7e000-7fd1e8c7f000 rw-p 00015000 08:05 790189      /lib/x86_64-linux-gnu/libgcc_s.so.1 
7fd1e8c7f000-7fd1e8e34000 r-xp 00000000 08:05 786443      /lib/x86_64-linux-gnu/libc-2.15.so 
7fd1e8e34000-7fd1e9034000 ---p 001b5000 08:05 786443      /lib/x86_64-linux-gnu/libc-2.15.so 
7fd1e9034000-7fd1e9038000 r--p 001b5000 08:05 786443      /lib/x86_64-linux-gnu/libc-2.15.so 
7fd1e9038000-7fd1e903a000 rw-p 001b9000 08:05 786443      /lib/x86_64-linux-gnu/libc-2.15.so 
7fd1e903a000-7fd1e903f000 rw-p 00000000 00:00 0 
7fd1e903f000-7fd1e9061000 r-xp 00000000 08:05 786555      /lib/x86_64-linux-gnu/ld-2.15.so 
7fd1e9249000-7fd1e924c000 rw-p 00000000 00:00 0 
7fd1e925c000-7fd1e9261000 rw-p 00000000 00:00 0 
7fd1e9261000-7fd1e9262000 r--p 00022000 08:05 786555      /lib/x86_64-linux-gnu/ld-2.15.so 
7fd1e9262000-7fd1e9264000 rw-p 00023000 08:05 786555      /lib/x86_64-linux-gnu/ld-2.15.so 
7fffe219c000-7fffe21bd000 rw-p 00000000 00:00 0       [stack] 
7fffe21fe000-7fffe2200000 r-xp 00000000 00:00 0       [vdso] 
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0     [vsyscall] 
Aborted (core dumped) 

이 출력은 첫 번째 라인을해야하지만 내가 왜 이런 식으로는 무엇입니까? 도와주세요.

+2

20 바이트 이상을'command'에 넣으려고하면 스택이 깨질 수 있습니다. – Pavel

답변

1

명령 문자열에 적절한 크기를 사용해야합니다. 아래의 프로그램이 효과가 있습니다.

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

int main() 
{ 
    int d,m,y ; 
    char command[1000]; 

    printf("Enter d: "); 
    scanf("%d",&d); 
    printf("Enter m: "); 
    scanf("%d",&m); 
    printf("Enter y: "); 
    scanf("%d",&y); 

    sprintf(command , "date -d %d/%d/%d | cut -b 1-3",m,d,y); 

    system(command) ; 
    return 0 ; 


} 
+0

감사합니다. 이것은 작동 중이다. – user3641971

0

command 어레이의 크기는 20 "date -d %d/%d/%d | cut -b 1-3",m,d,y하지만 더 긴 다음 20 문자이다. 따라서 command 배열의 크기를 늘려야합니다.

관련 문제