본문 바로가기

프로그래밍226

C ] sscanf() 사용법 %d : 공백으로 구분된 문자열을 정수로 읽어들인다. %s : 공백으로 구분된 문자열을 문자열로 읽어들인다. %*s : 공백으로 구분된 문자열을 읽어들이지 않고 건너뛴다. #include #include int main(void) { char *str = "ABC 123"; int num = 0; sscanf(str, "%*s %d", &num); printf("%d\n", num); } %[A] : 현재 위치에서 문자 A가 있는 경우 A를 문자열로 읽어들인다. %*[A] : 현재 위치에서 문자 A를 읽어들이지 않고 건너뛴다. %[^B] : 현재 위치에서 문자 B 직전까지 문자열로 읽어들인다. %*[^B] : 현재 위치에서 문자 B 직전까지를 읽어들이지 않고 건너 뛴다. (포인터는 B 위치) #inclu.. 2023. 1. 15.
C ] strtol, strtoul : 정수 문자열을 진수 선택하여 long/unsigned long 값으로 변환 (2진수, 8진수, 10진수, 16진수) strtol strtol 함수는 정수로 구성된 문자열 str을 세번째 파라미터인 진수체계로 판단하여 long 형식 값으로 반환한다. 더이상 계산할 수 없는 문자를 발견하면 두번째 파라미터인 endptr에 해당 위치를 저장한다. #include long strtol (const char* str, char** endptr, int base); - 파라미터str : long 형식 값을 구할 문자열endptr : 계산을 끝낸 위치를 저장할 문자열 포인터base : 진수- 리턴 값 : 계산된 long 형식 값 #include #include int main(void){ char src[100]="123 ff 16 1001 -10"; char *pos=NULL; long value1=0,value.. 2023. 1. 15.
C ] strtok, strtok_r : 구분 문자로 문자열 쪼개기 strtok 함수는 문자열을 구분문자(delimiter) 단위로 쪼개는데 사용되는데 이렇게 쪼개진 문자열을 토큰(token)이라고 한다. str에 쪼개고자 하는 문자열을 전달하면 str의 가장 첫번째 문자가 토큰의 시작이 되고 delim에 포함된 문자들 중 하나를 만나는 곳이 토큰의 마지막이 되며, 원래 delimiter가 있었던 토큰의 마지막을 null-terminted 하고 토큰의 시작 주소를 리턴한다. strtok 함수는 내부에 static 변수로 str 문자열에서 작업을 끝낸 다음 위치를 기억하고 있기 때문에, 이 다음에 str인자로 NULL을 전달하며 호출하면 이전에 찾았던 토큰 바로 다음 문자부터 시작해서 분리작업을 진행한다. 그러다 맨처음에 전달된 str 문자열의 NULL 문자에 도달하게 되.. 2023. 1. 15.
Windows Forms 시작하기 - 컨트롤의 주요 속성 도구상자 - 모든 Windows Forms - Button 생성 Iconfinder 사이트에서 이미지를 찾고 버튼 우클릭 - 속성을 누른뒤 해당 이미지를 추가한다. More sizes 를 누르면 더 다양한 px 이미지를 다운받을 수 있다. Image Image 밑의 ImageAlign을 눌러 버튼에서 이미지를 위치시킬 곳을 선택할 수 있다. Text Text 를 입력하고 TextAlign 도 선택한다. Font Font 를 굵게 설정하였다. Cursor Form 의 기본 커서는 Arrow 인데 버튼의 커서는 hand로 설정해준다. 버튼에 커서를 올렸을 때만 hand 모양으로 바뀌는 것을 볼 수 있다. Visible False 로 설정하면 사용자가 해당 버튼을 볼 수 없다. Enable False 로 설정.. 2023. 1. 7.
Windows forms 시작하기 - form 속성 새 프로젝트 만들기 - Windows Forms 앱(.NET Framework) 선택 .NET Framework 버전을 선택하고 프로젝트를 생성한다. 보기 - 도구상자 .cs 파일 오른쪽 클릭 - 속성 위의 화면에서 Form 또는 컨트롤을 더블클릭하면 아래와 같이 코딩을 할 수 있는 화면이 나오는데 여기서 또 다시 우클릭 - 디자이너 보기를 선택하면 전의 화면으로 돌아갈 수 있다. 프로젝트의 구조는 아래와 같다. .Designer.cs 파일은 Form에 컨트롤을 추가하거나 수정하면 코드가 자동생성되는 파일이고 그 밑의 .resx 파일은 문자열, 이미지, 개체 데이터가 포함된 리소스 파일이다. 속성 뷰에서는 비슷한 카테고리끼리 그룹핑된 항목별 나열 방식으로 볼 수 도 있고, 알파벳 순으로 볼 수도 있다. .. 2023. 1. 7.
윈도우 소켓 ] 소켓 프로그래밍 용어 및 함수 정리 출처 : 윤성우의 열혈 TCP/IP 소켓 프로그래밍 소켓 생성시 필요한 매개변수 첫번째, 두번째 인자로 전달된 정보를 통해 소켓의 프로토콜이 사실상 결정되기 때문에 세번째 인자로 0을 전달해도 된다. 프로토콜 체계 소켓의 타입 1. SOCK_STREAM 중간에 데이터가 소멸되지 않고 목적지로 전송된다. 전송 순서대로 데이터가 수신된다. 전송되는 데이터의 경계가 존재하지 않는다 여러번의 write 함수호출을 통해 전송된 데이터를 한번의 read 함수 호출을 통해 전부 수신할 수 있고, 반대로 한번의 write 함수호출을 통해 전송된 데이터를 여러번의 read 함수 호출을 통해 수신할 수 있다. write/read 함수 호출 횟수가 큰 의미를 갖지 못한다. 수신된 데이터는 소켓에 존재하는 버퍼에 저장되고, .. 2023. 1. 1.
윈도우 소켓 ] TCP 에코 서버, 클라이언트 및 동작원리 TCP 서버의 함수 호출 순서 TCP 서버에서 listen 함수호출을 통해 연결요청 대기상태에 들어가면 클라이언트가 connect() 함수호출을 통해서 연결요청을 할 수 있다. int listen(SOCKET s, int backlog); s : 연결요청 대기상태에 두고자 하는 소켓 전달. 이 함수 인자로 전달된 소켓이 서버 소켓(리스닝 소켓)이 된다. backlog : 연결요청 대기 큐의 크기정보 전달, ex. 5가 전달되면 클라이언트의 연결요청을 5개까지 대기시킬 수 있다. 적절한 값은 실험적 결과에 의존해 결정하면 되고 일반적으로 웹서버와 같이 잦은 연결요청을 받는 서버의 경우 15 이상을 전달한다. listen 함수 호출이후 클라이언트의 연결요청이 들어왔다면, 들어온 순서대로 연결요청을 수락하고 .. 2023. 1. 1.
윈도우 소켓 ] UDP 서버, 클라이언트 📝 UDP 소켓과 TCP 소켓의 차이점 TCP 소켓 (연결지향형 SOCK_STREAM) 중간에 데이터가 소멸되지 않는다. 전송 순서대로 데이터가 수신된다. 데이터의 경계가 존재하지 않는다. 소켓 대 소켓의 연결은 반드시 1 대1의 구조이다. UDP 소켓 (비 연결지향형 SOCK_DGRAM) Flow Control 이 없다. 그러므로 SEQ, ACK 같은 메시지 전달을 하지 않는다. 연결의 설정과 해제의 과정이 존재하지 않는다. 데이터 분실 및 파손의 위험이 존재한다. 데이터 전송이 빠름 한번에 전송할 수 있는 데이터의 크기가 제한된다. 서버소켓과 클라이언트의 소켓 구분이 없이 하나의 소켓으로 둘 이상의 노드와 데이터 송수신이 가능하다. UDP 송수신 함수 #include int sendto(SOCKET .. 2022. 12. 27.
윈도우 소켓 ] Winsock 라이브러리 링크하기 Winsock이란? Windows Sockets API(WSA)로 인터넷 네트워크 및 소켓과 관련된 함수들을 제공해준다. Winsock은 버전1과 버전2가 있으며 Winsock1에 여러 기능이 좀 더 추가된 것이 Winsock2이다. 윈도우에서 소켓 프로그래밍을 하기 위해선 헤더를 포함하고 라이브러리를 링크시켜야한다. 라이브러리를 링크하는 3가지 방법이 있다. 셋 중 하나를 택하면 된다. 1. 프로젝트 우클릭 - 속성 - 링커 - 입력 - 추가종속성에 ws2_32.lib 를 추가한다. 2. 소스코드 위에 다음과 같은 전처리기 지시문을 작성한다. #pragma comment(lib,"ws2_32") 3. 링크할 라이브러리의 경로를 찾아가 직접 ws2_32.lib 파일을 프로젝트에 추가한다. (프로젝트 우클.. 2022. 12. 16.
C/C++ ] tick / 시간 측정하기 C 인 경우 time.h 를 포함하고 C++인 경우 ctime을 포함한다. #include #include 시간 측정은 두 헤더에 모두 포함된 clock()함수를 사용하면 된다. clock_t clock(void); 반환형은 clock_t 타입인데 따라가보면 그냥 long 타입이다. typedef long clock_t; 그리고 반환하는 내용으로 프로그램 실행 시작부터 경과된 시간을 ms 단위의 정수형으로 반환한다. 사용방법 #include #include int main() { long startTime = (long)clock(); while (1) { long currentTime = (long)clock(); if (currentTime - startTime >= 1000UL) { printf(".. 2022. 12. 14.
C ] 가변인자 매크로를 활용한 디버그 로그 남기기, Predefined macros 함수의 가변인자 함수가 있듯이 매크로에도 가변인자 매크로가 있다. #define printlog(fmt, ...) printf(fmt, __VA_ARGS__) printlog(fmt, ...) 의 "..."이 "__VA_ARGS__"로 확장된다. 그리고 아래에서 __VA_ARGS__ 앞에 붙은 ##은 인수가 전혀없는 경우에 오류를 내지 않기 위해 gcc에서 도입한 표기법이다. 앞에 ##을 붙이지 않으면 인수가 전혀 없는 경우에 printf("",) 이런식으로 컴마가 붙은채로 확장되어 오류를 낼 것이다. 이런 가변인자 매크로는 디버그용 로그를 남길 때 유용하게 사용된다. C언어에 미리 정의된 매크로들을 사용하여 오류가난 파일명, 라인넘버, 함수명을 알 수 있다. #include #include #defin.. 2022. 12. 11.
전처리기 ] # 문자열화 연산자 # 연산자 : 문자열 치환 # 연산자는 함수형 매크로에서 매개변수를 문자열로 변환하는데 사용된다. 또한 매크로가 문자열과 나란히 쓰이면 하나의 문자열로 간주된다. 따라서 다음과 같은 결과가 나온다. #include #define STR(x) #x int main() { printf("%s\n", STR(01234)"56789"); return 0; } 문제가 발생하는 경우는 아래와 같은 경우다. #include #define NAME HongGilDong #define STR(x) #x int main() { puts(STR(NAME)); return 0; } HongGilDong이 출력되길 의도했지만 NAME이 출력되었다. 이에 대한 해결 방법은 다음과 같다. #define STR_(x) #x #def.. 2022. 12. 9.
C ] 빅엔디안 리틀엔디안 변환함수 구현 + 매크로 함수 작성시 주의점 htons(), htonl(), ntohs(), ntohl() 함수를 쓰지 않고 직접 구현하기 #include #define uint16_t unsigned short #define uint32_t unsigned int #define SWAP_UINT16(x) ((uint16_t)((((x) & 0xff00) >> 8) | (((x) & 0x00ff) > 24) | (((x) & 0x00ff0000) >> 8) | (((x) & 0x0000ff00) 8) & 0x00ff) + (((x) & 0x00ff) 2022. 10. 22.
C ] memset 함수 구현 void *my_memset(void *s, int c, int len) { unsigned char *p = (unsigned char *)s; while (len > 0) { *p = c; p++; len--; } return (s); } #include void *my_memset(void *s, int c, int len) { unsigned char *p = (unsigned char *)s; while (len > 0) { *p = c; p++; len--; } return (s); } int main() { char str[13] = "hello world!"; for (int i = 0; str[i] != '\0'; i++) { printf("%c", str[i]); } printf("\n.. 2022. 10. 9.
MFC ] 리스트 컨트롤에 행 단위 색상 입히기 (글자색/배경색) 메시지맵에 다음을 추가한다. BEGIN_MESSAGE_MAP(CdeltaControlDlg, CDialogEx) //... ON_NOTIFY(NM_CUSTOMDRAW, IDC_LIST_MEMORY, OnCustomdrawMyList) END_MESSAGE_MAP() notification code가 NM_CUSTOMDRAW 일 때 내 리스트 컨트롤 ID로 부터 온 WM_NOTIFY 메시지를 핸들 하고 싶다는 뜻이다. 헤더에 메시지 처리함수의 원형을 선언한다. afx_msg void OnCustomdrawMyList(NMHDR* pNMHDR, LRESULT* pResult); 메시지 처리 함수의 정의 void CdeltaControlDlg::OnCustomdrawMyList(NMHDR* pNMHDR, LR.. 2022. 9. 18.
MFC ] 쓰레드의 생성 및 시작, 종료, 일시 중단, 재개 -Dlg.h 파일에 쓰레드 핸들링을 위한 변수 선언 typedef enum { THREAD_STOP, THREAD_RUNNING, THREAD_PAUSE }_ThreadStatus; //... public: CWinThread* m_pThread; _ThreadStatus m_threadStatus; 쓰레드 함수 전역으로 정의 만약 메인 함수로 정의하려면 앞에 static 을 붙여야 한다. 함수 앞에 static을 붙이면 전역으로 취급되지만 해당 소스파일 내에서만 호출할 수 있다. UINT ThreadRepeat(LPVOID LpData) { CdeltaControlDlg* pDlg = (CdeltaControlDlg*)(LpData); vector& refList = pDlg->DC.getList();.. 2022. 9. 18.
MFC ] 새 코드 요소를 반환하지 못했습니다. 구문 오류일 수 있습니다. 해결방법 프로젝트 폴더 내의 .vs 폴더를 지우고 다시 실행시키면 잘 된다. 2022. 9. 18.
Warning: skipping non-radio button in group 경고 제거하는 법 큰 문제는 없지만 보기 거슬리니 제거하는 방법은 다음과 같다. CTRL + D 를 누르면 각 컨트롤의 번호를 볼 수 있고 이 상태에서 클릭을 하면 1부터 순차적으로 다시 지정할 수 있다. 그룹의 라디오 버튼을 순차적으로 눌러주고 마지막 라디오 버튼의 다음 번호인 컨트롤의 속성-그룹을 True 로 바꿔주면 해당 경고문구는 사라진다. 2022. 9. 14.
MFC ] 라디오 버튼 그룹 지정하여 사용하기 + 초기값 지정하기 직관적으로 만들기 위해 그룹 박스를 먼저 그려주고 그 위에 라디오 버튼을 만든다. 라디오 버튼을 MOVE, DELAY, PUMP 이렇게 3개를 만들었다. 내가 생성한 컨트롤에는 각 ID마다 #define으로 숫자값이 부여되는데 이건 Resource.h 에 정의되어 있다. 이 값이 1씩 증가해야 그룹지어 사용할 수 있다. Ctrl+D 를 눌러 중간에 끼어드는 값 없이 번호가 순차적으로 부여되었는지 시각적으로 확인할 수도 있다. 각 라디오 버튼의 속성은 아래처럼 설정한다. 라디오 버튼은 그룹 True 부터 시작해서 다음 True를 만나기 전까지 하나의 그룹으로 묶인다. 이렇게 한 그룹으로 묶이면 클래스 마법사에서 확인해봤을 때 그룹의 첫번째 라디오 버튼만 뜨는 것을 확인할 수 있다. -Dlg.h 파일에 체크.. 2022. 9. 13.
MFC ] 리스트 컨트롤 첫번째 열 가운데 정렬하는 법 BOOL CdeltaControlDlg::OnInitDialog() { //... m_list.SetExtendedStyle( LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT); m_list.InsertColumn(0, _T(""), LVCFMT_CENTER, 0); m_list.InsertColumn(1, _T("No."), LVCFMT_CENTER, 40); m_list.InsertColumn(2, _T("Action Type"), LVCFMT_CENTER, 160); m_list.InsertColumn(3, _T("Attributes"), LVCFMT_CENTER, 304); //... } 리스트 컨트롤의 첫번째 열은 왼쪽 정렬밖에 안되는 데 굳이 가운데 정렬를 하고 싶다면 .. 2022. 9. 13.
MFC ] 슬라이더 컨트롤 사용하기 도구 상자 - Slider Control 생성하고 그 옆에 Edit Control을 만든다. ID는 다음과 같이 변경했다. 에디트 컨트롤 속성의 숫자를 True로 하면 숫자만 입력되게끔 할 수 있다. 슬라이더 컨트롤은 범주 컨트롤로 변수 추가하고 에디트 컨트롤은 값 CString으로 변수를 추가한다. OnInitDialog() 에 다음과 같이 추가한다. BOOL CdeltaControlDlg::OnInitDialog() { //... SliderInit(&m_sliderX); SliderInit(&m_sliderY); SliderInit(&m_sliderZ); m_strX.Format(_T("%d"), 0); m_strY.Format(_T("%d"), 0); m_strZ.Format(_T("%d"), -.. 2022. 9. 10.
Python ] Visual Studio Code 에서 Jupyter Notebook 사용하기 Extension 에서 Python 설치 그러면 Jupyter notebook Extension 도 같이 설치된다. 주피터 노트북은 파일 - 새 파일이 아니라 명령 팔레트로 만들어야한다. Ctrl + Shift + P 를 눌러 명령 팔레트를 켜고 jupyter를 쳐서 Create New Jypyter Notebook 선택 2022. 9. 2.
Python ] 아나콘다, 주피터 노트북 설치하기 아나콘다는 머신러닝이나 데이터 분석 등 수학과 과학 분야에서 사용되는 여러 패키지들을 묶어 놓은 파이썬 배포판으로기본설치파일에 더해 SciPy, Numpy, Matplotlib, Pandas 등을 비롯한 많은 패키지들을 포함하고 있다.아나콘다는 내부적으로 conda라는 환경/패키지 관리자가 존재하여 파이썬 가상 환경을 구축하는데도 유용하게 사용할 수 있어 결과적으로 프로젝트별 개발 환경을 효율적으로 구성할 수 있다 1. ANACONDA 공식 홈페이지에 가서 다운로드 받고 설치하기기존에 파이썬을 설치해놨다면 지우고 설치하는것이 좋다.아나콘다를 깔면 Python 3.9 버전이 깔린다. recommended인 Just Me를 선택한다. All Users로 하면 나중에 라이브러리 업데이트나 삭제시 관리자 권한이.. 2022. 9. 1.
C 와 C++ 으로 10진수를 2진수로 변환하여 출력하기 C #include int main() { short n = 0; printf("-32,768~32,767 사이의 정수를 입력하세요: "); scanf("%hd", &n); for(int i=15; i>=0; i--){ printf("%d", (n >> i) & 1 ); if(i%4==0) printf(" "); } return 0; } C++ #include #include using namespace std; int main() { short n = 0; coutn; cout 2022. 9. 1.
MFC ] 윈도우 크기 조절 또는 고정하기, 최소/최대 사이즈 지정 1. WM_GETMINMAXINFO 메시지 처리기 함수를 추가한다. 속성 - 메시지 - WM_GETMINMAXINFO 를 찾아서 Add 혹은 프로젝트 - 클래스 마법사 2. OnGetMinMaxInfo 함수 안에서 전달된 파라미러 lpMMI를 사용해 창의 min / max 값을 설정한다. void CdeltaControlDlg::OnGetMinMaxInfo(MINMAXINFO* lpMMI) { //lpMMI->ptMinTrackSize.x = 1200; //lpMMI->ptMinTrackSize.y = 800; lpMMI->ptMinTrackSize = CPoint(1200, 800); lpMMI->ptMaxTrackSize = CPoint(1400, 1000); CDialogEx::OnGetMinMax.. 2022. 8. 28.
C, Linux ] pthread 사용해 보기 #include #include #include #include #include void *thread1_func (void *vargp) { unsigned short cnt=0; printf("Thread 1 function starts...\n"); while(1) { sleep(1); printf("thread1_func is running ===>(%d)\n", cnt++); } } void *thread2_func (void *vargp) { unsigned short cnt=0; printf("Thread 2 function starts...\n"); while(1) { sleep(3); printf("thread2_func is running =======> (%d)\n", cnt++); .. 2022. 8. 25.
C ] 명령 프롬프트 구현 (함수포인터 사용) #include #include /* for strcmp() strlen*/ //#include /* for usleep() */ #include #include // argv MAX #define MAX_CMD_NUM 10 // string MAX #define BUF_LEN 128 int cmd_continue = 0; typedef int cmd_func(int argc, char* argv[]); struct Command_List { char* cmd; cmd_func* func; char* help_str; }; int cmd_test1(int argc, char* argv[]) { if (argv[1] == NULL) { printf("test 1 command received. \n"); .. 2022. 8. 25.
C ] 전처리기 (Preprocessor) 전처리기(preprocessor)는 프로그램을 컴파일할 때 컴파일 직전에 실행되는 것으로, 전처리기가 실행되면 각 코드 파일에서 #으로 시작하는 지시자(directives)를 찾는다. #include 지정된 파일을 그 위치에 복사, 파일을 포함시키기 위해 사용한다. Current directory 에서 먼저 찾고 그 다음 표준 라이브러리에서 찾음 // 표준 라이브러리 #include // 사용자가 정의한 파일 #include "filename" #define 심볼릭 상수나 매크로를 생성할 때 사용. 컴파일 시 텍스트로 대체됨. 매크로 사용의 장점은 코딩 오버헤드를 줄여줌. #define PI 3.141592 #define CIRCLE_AREA( x ) ( (PI) * ( x ) * ( x ) ) #def.. 2022. 8. 24.
C, Linux ] ls 명령어 구현 리눅스의 ls 명령어 구현하기 #include #include // 디렉터리 관련 DIR, struct dirent, opendir(), readdir(), closedir() 등이 정의된 헤더 포함 #include // Unix 에 쓰이는 표준 심볼들과 상수, 함수들이 정의된 헤더 포함 #include int main(int argc, char* argv[]) { // cwd에 1024 byte 동적할당 char * cwd = (char *)malloc(sizeof(char) * 1024); // DIR 과 dirent 구조체 포인터를 만들고 일단 NULL 대입 DIR * dir = NULL; struct dirent * entry = NULL; // 추가 인자 없이 실행된 경우 if(argc==1){.. 2022. 8. 17.
C, Linux ] main 함수의 매개변수 사용해서 파일 입출력 하기 main 함수에 전달되는 파라미터를 활용해 코드를 짤 때는 아래와 같이 출력해 디버깅 해보면 편하다. for(int i=0; i< argc; i++){ printf("%s\n",argv[i]); } 1. main 함수의 argument 로 파일이름과 파일에 저장할 문자열을 입력받아 파일을 생성하는 프로그램 #include #include #include int main(int argc, char *argv[]){ /* for(int i=0; i< argc; i++){ printf("%s\n",argv[i]); } */ if (argc < 3) { printf("Usage: fileio.exe "); return 0; } FILE *fp; fp = fopen(argv[1], "w"); if(fp==NULL.. 2022. 8. 17.