c++의 STL을 쓰다 보면, 의도치 않게 공백을 포함해서 입력을 받아야 하는 경우가 있습니다. 이 때, 저는 fgets를 많이 이용합니다. 이 함수의 원형은 아래와 같습니다. 2번째 인자인 num이 눈에 보이는데요. num - 1개의 문자만큼 받거나, '\n'을 입력받거나, 아니면 EOF가 입력될 때 까지 입력을 받습니다. gets와는 다른 특성을 가지는데요. num이 없어요. 몇 byte까지 받아야 되는 정보가 없고, 단지 포인터만 넘겨줍니다. 문자열의 시작 주소만 넘겨준 상태에서, 크기를 모르는 상태에서 무한정 받아버리면 어떻게 될까요? 허용되지 않는 공간에 이상한 값을 덮어씌워 버릴 수 있어요. 안전하지 않아요. bound 조차 없기 때문입니다. 얼만큼 받을 건지에 대해서 넘겨주기 때문에, 기본적..
코딩/C 검색 결과
네트워크 프로그래밍 시간에, htonl 이런 함수들을 배울 거에요. 리틀 엔디안 순서면, 빅 엔디안 순서로 바꿔버리는, 뭐 그러한 메소드입니다. 더 정확히 말하면, 이런 변환을 해야 합니다. uint32_t를 리틀 엔디안으로 표현한 것이 ABCD라고 해 봅시다. 이걸 빅 엔디안으로 바꾸면 DCBA입니다. 여러 방법이 있지만, c언어의 공용체를 이용해서 쉽게 처리하는 방법을 배워보도록 하겠습니다. 공용체의 멤버들은 같은 메모리 공간을 공유합니다. 구조체는, 멤버들이 같은 메모리 공간을 공유하지 않습니다. 그러면 아래와 같이 선언하면 어떻게 될까요? moo 변수인 t를 할당할 때 메모리에 어떻게 그려지는지 보겠습니다. 이렇게 될 겁니다. 중요한 것은 num과 char형 배열인 x는 메모리 공간을 공유한다는 ..
입력을 신뢰하면 안 된다. 현실 세계에서는 알고리즘 문제와 같이 제한에 맞춰서 입력이 들어오지 않는다. 이 말은 많이 들어보셨으리라 생각이 듭니다. c언어에서 많은 string 함수, 예를 들어서 strcpy, strcat 같은 것들이 이런 문제를 가지고 있다고 하는데, 무엇일까요? 문자를 5개 저장할 수 있는 배열을 선언했습니다. 문자열은 NULL 문자가 끝에 들어갑니다. 그러면, 길이가 4인 문자열까지는 들어갈 수 있습니다. 예를 들어 "cho"는 길이가 3인 문자열입니다. 그러므로, 들어갈 수 있습니다. 그런데, 이런 경우라면 어떨까요? "chogahui를 넣는다. 길이가 8입니다. 그런데, gets나, strcpy, strcat에 들어가는 정보는 string 배열의 시작 주소일 뿐입니다. 길이 값..
다음 코드를 봅시다. FOO(x)는 ((x)*(x))로 define이 된 매크로입니다. 그리고 6번째 줄에 FOO(p(0)); 이 있어요. 이것은 어떻게 대치가 될까요? 만약에 위와 같이 대치가 된다면, 어떻게 될까요? p가 2번 호출됩니다. 이것만 보면 이게 굳이 왜. 라는 생각이 드실 수도 있을 거에요. 자. 그러면 질문을 바꿔 봅시다. FOO(u = p(0))은 어떻게 대치가 될까요? 만약에, 이렇게 대치가 된다면 어떨까요? 봐도 모르겠으니, wandbox에서 돌려보겠습니다. operation on 'u' may be undefined. 라고 나옵니다. 음.. 뭔 이야기인지는 모르겠지만, u에 대한 연산이 정의되지 않는다. 정도로 해석을 하면 됩니다. 사이드 이펙트가 있다고 생각해도 무난합니다. 그..
file 입출력을 다루기 위해서는, 입출력 함수들에 대해서 알고 있어야 합니다. 오늘은 이 중에서 getchar에 대해서 알아보도록 하겠습니다. 이 함수는 getc(stdin)을 호출한 것과 동일한 역할을 한다고 링크에서 설명을 하고 있어요. getc와 fgetc에 대해서는, 추후에 다시 설명을 할 기회가 있을 듯 싶네요. stdin에서 어떻게 읽어오는지 대략적으로 그림을 그리실 필요가 있어요. 예를 들어, 이런 프로그램이 있다고 생각해 봅시다. 저는 age와 성별을 받았습니다. 그렇게 해서, 나이와 성별에 대한 정보를 출력하기를 기대하고 있어요. 그런데, 실제로는, age에는 23이 들어갔는데 gen에는 M이나 F가 저장되지 않았다는 것을 알 수 있어요. 예를 들어 2를 입력하고 엔터를 쳤다고 해 봅시..
최근댓글