티스토리 뷰

char a[12]={}; //입력을 받기 위한 문자 배열
int A,B;
__libc_start_main(){
    A=B=0; //점수를 담기위한 변수의 초기화
    read(0,a,12); //12만큼 받는 이유는 입력 버퍼에서 '\n'까지 처리하기 위함, (물론 a에는 '\n'이 들어갈 자리가 없습니다, 버려집니다)
    A=(a[0]-48)*13+(a[2]-48)*7+(a[4]-48)*5+(a[6]-48)*3+(a[8]-48)*3+(a[10]-48)*2; //첫번째 줄 처리
    read(0,a,11); //두번째 줄 입력
    B=(a[0]-48)*13+(a[2]-48)*7+(a[4]-48)*5+(a[6]-48)*3+(a[8]-48)*3+(a[10]-48)*2+2; //두번째 줄 처리
    if(A>=B) write(1,"cocjr0208",9); else write(1,"ekwoo",5); //결과
    _exit(0);
}main;

 

 

풀이 : 구현

 

0. 숫자의 범위는 한자리수 입니다. 즉 바로 문자를 정수로 바꾸어 줄 수 있습니다 -'0'

 

1.

문자열 리터럴 " " 은

"asdfsdfsd" 이렇게 적어도, 프로그램 실행시 저절로 메모리에 할당이 되며, 인자로 넘길때는 첫번째 값의 주소가 넘어갑니다. 수정을 하지 않는 문자열이라면 즉 따로 변수로 만들어서 저장하여 사용하지 않아도 됩니다. 수정은 불가합니다.

 

write(1,"cocjr0208",9); else write(1,"ekwoo",5);

여기서 "cocjr0208" "ekwoo"을 굳이 char 형 배열에 저장할 필요가 없다.

 

2.

입력이 두줄로 주어질때

ex)

a a a a a a : 문자 11개 (공백도 문자입니다)

b b b b b b : 문자 11개 (공백도 문자입니다)


c언어의 입력 버퍼 에선 'a' ,' ', 'a' ,' ', 'a' ,' ', 'a' ,' ', 'a' ,' ', 'a' , '\n', 'b' ,' ', 'b' ,' ', 'b' ,' ', 'b' ,' ', 'b' ,' ', 'b' 로 들어오게 됩니다. 그러므로 처음 입력을 받을 때는 개행문자 '\n'을 고려하여 1바이트 더 많이 입력으로 받아야 합니다.

 

그래서 입력을 받는 배열의 크기도 개행문자를 고려하여 12 입니다.

 

만약 배열의 크기가 11인데 입력 버퍼에서 배열의 크기보다 더 많은 byte을 읽는다면 알수없는 동작이 발생합니다.

그러나 배열의 크기가 충분히 크고 버퍼에 있는 byte 보다 더 많은 값을 읽는다면 버퍼에 있는 값 전부 읽은 다음 종료됩니다.

 

고로 배열의 크기를 충분히 크게 한다음, 초과하지 않을 만큼 버퍼에서 byte을 취하는 것이 안전합니다.

 

https://www.acmicpc.net/problem/32684

최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함