프로그래밍/C70 scanf , scanf_s " %d "로 정수 입력 받으려다 문자(열)이 잘못 들어왔을 때 무한루프에 빠지는 문제 / 문장 씹히는 문제 해결 사용자가 꼭 우리가 기대한대로 입력하라는 법이 없으니 이러한 예외처리도 필요하다. scanf, scanf_s %d로 정수 입력 받으려다 문자나 문자열이 들어왔을 때 무한루프에 빠지는 문제 혹은 다음 문장이 씹히고 그 다음으로 넘어가는 문제의 해결책은 동일하다. 입력버퍼를 비워주면 된다. scanf 함수는 %d 정수형을 입력받기 위해 대기하고 있었는데 문자/문자열이 들어오니 값을 대입하지 못하고 그게 입력스트림에 계속 남아서 문제를 일으키는 것이다. 입력 버퍼를 비우는 방법으로 구글링을 해보면 다음과 같은 방법이 나온다. 1. fflush(stdin) -> 사용X fflush 함수는 원래 출력버퍼를 비우는 용도이기에 사용하지 말라고 함. (출처 : C언어 열혈 프로그래밍 책) 2. rewind(stdin).. 2022. 4. 27. [ C언어 ] enum 의 활용 + 사용예제 열거형 enum은 관련이 있는 정수형 상수의 집합으로 typedef로 별칭을 정의하면 더욱 편리하게 사용 가능하다. 간단한 예제 #include typedef enum { FALSE, TRUE }boolean; typedef enum { MALE =1, FEMALE }gender; int main(void) { boolean exit=FALSE; char answer; while (exit == FALSE) { printf("성별을 입력하세요(1.남자, 2.여자):"); scanf_s("%hhd", &answer); rewind(stdin); if (answer == FEMALE) { printf("여자입니다.\n"); } else if (answer == MALE) { printf("남자입니다.\n").. 2022. 4. 26. [ C언어 ] 프로젝트(삽질일기) : 도서 관리 프로그램 - (4) - 파일 입출력 - fopen / fopen_s, .bin 바이너리 파일 읽기 / 쓰기 파일 입출력 기능을 추가한 도서 관리 프로그램 개선 4탄. 2022.04.22 - [Language/C] - [C언어] 프로젝트(삽질일기) : 도서 관리 프로그램 - (3) - 동적 메모리 할당 - 구조체 배열 크기 동적 조절 (확대/축소) 이전까지는 내가 프로그램을 켜고 도서 추가/삭제를 해도 끄고 나서 프로그램을 다시키면 여전히 내가 소스파일에 입력해놓은 초기데이터가 보였었다. 하지만 나는 프로그램 실행중에 데이터를 가공하고 껐을 때 그 데이터가 어딘가 잘 저장되어 있다가 다시 키면 읽어오는 방식으로 연속적으로 관리하고 싶어졌다. 결과물 투척 파일 읽기 FILE* fp = NULL; errno_t err = fopen_s(&fp, "booklist.bin", "rb"); if (err == 0) { .. 2022. 4. 25. size_t 와 unsigned int 형의 차이 size_t 는 부호 없는 정수로서 포인터나 메모리의 크기를 나타내는 데 사용되는 데이터 타입이다. stddef.h 헤더 파일에서 정의되어 있으며 플랫폼에 따라 그 정의가 달라진다. 일반적으로 32비트 아키텍처에서는 unsigned int로 정의되고, 64비트 아키텍처에서는 unsigned long long 으로 정의된다. sizeof() 함수를 사용해서 size_t 타입의 크기를 확인해보자. Visual Studio에서 프로젝트 빌드 구성을 x86으로 하면 4 byte, x64로 선택하면 8 byte로 확인된다. 아래 사이트에서도 확인 가능하다. https://www.ibm.com/docs/ko/ibm-mq/7.5?topic=ssfksj-7-5-0-com-ibm-mq-ref-dev-doc-q104610.. 2022. 4. 24. [ C언어 ] 프로젝트(삽질일기) : 도서 관리 프로그램 - (2) - 동적 메모리 할당 지난편에 이어 도서 삭제기능을 동적할당을 사용한 버전으로 바꿔보자. 2022.04.12 - [Language/C] - [C언어] 프로젝트(삽질일기) : 도서 관리 프로그램 - (1) - 구조체 배열 처음으로 돌아가서 삭제기능은 먼저 검색을 수행하고 검색결과를 출력해서 보여준 뒤 삭제할지 말지 선택을 입력받고 삭제하게 해야했다. 그럼 삭제함수 안에서 검색함수를 호출해야하고 그 검색결과가 담긴 데이터가 필요한데 여기서 문제가 있다. 일반적으로 검색함수 내에서 변수(배열)를 선언하면 그 지역변수는 함수를 빠져나오면서 소멸된다. 하지만 내가 필요한 검색결과가 담긴 변수의 수명은 검색함수의 시작과 끝을 함께하면 안된다. 삭제함수가 필요할 때 생성되고 삭제후 필요없어지면 사라져도 되는데 이런상황을 위해 동적할당이 .. 2022. 4. 22. [ C언어 ] 프로젝트(삽질일기) : 도서 관리 프로그램 - (3) - 동적 메모리 할당 - 구조체 배열 크기 동적 조절 ( 확대 / 축소 ), #ifdef DEBUG 사용 동적 메모리 할당을 적용한 도서 관리 프로그램 개선 3탄. 2022.04.17 - [Language/C] - [C언어] 프로젝트(삽질일기) : 도서 관리 프로그램 - (2) - 동적 메모리 할당 이전 까지는 #define을 통해 구조체 배열인 booklist의 SIZE를 20으로 고정했었다. 하지만 동적 메모리 할당을 한번 해보니 더 본격적으로 써보고 싶어진다. 도서가 계속 추가 되어 배열이 꽉 찬다면 배열의 크기를 늘리고 싶고 데이터가 줄어들어 빈공간이 널널한다면 배열을 다시 축소하고 싶은데 어떻게 하면 될까? 참고로 배열을 선언할 땐 대괄호 안에 변수를 넣을 수 없다. 선언한 뒤 사용할 때는 인덱스 자리에 변수를 넣어서 활용 할 수 있지만 선언 할때 변수를 넣으면는 위와 같이 C2466 에러가 난다... 2022. 4. 22. 구조체의 크기 / 구조체 정렬 - 패딩비트를 #progma pack 사용으로 해결 구조체의 크기가 생각과는 달라서 당황했던 적이 있는데 구글링을 통해 쉽게 답을 찾았다. 위 구조체의 size는 1 byte가 맞다. 하지만 구조체 안에 여러 자료형이 들어있으면 어떻게 될까? #include typedef struct { char a;// 1 byte int b;// 4 byte double c;// 8 byte } TEST; int main(void) { TEST test; printf("구조체멤버 a의 크기 : %d\n", sizeof(test.a)); printf("구조체멤버 b 크기 : %d\n", sizeof(test.b)); printf("구조체멤버 c 크기 : %d\n", sizeof(test.c)); printf("구조체 test 크기 : %d\n", sizeof(TEST).. 2022. 4. 20. 64비트 운영체제인데 포인터 크기가 왜 4바이트라고 나올까? char* p1; int* p2; double* p3; printf("%d\n", sizeof(p1)); printf("%d\n", sizeof(p2)); printf("%d\n", sizeof(p3)); 분명 수업에서 들었을 때는 8바이트가 나올거라고 했는데 실제 위와같이 코드를 치고 실행해보니 4바이트 라고 나왔다.. 열심히 검색해보니 이유는 내가 사용하는 Visual Studio에서 32비트 용으로 컴파일 하기 때문.. 솔루션 플랫폼을 x86이 아니라 x64로 바꿔주면 8바이트라고 제대로 뜬다. 그리고 리눅스 64비트 환경에서도 gcc로 컴파일 하니 8바이트라고 떴다. 주소값도 16진수로 16자리나 된다. 결론은 내가 개발하고 있는 pc의 환경이 아니라 어느 플랫폼을 대상으로 컴파일하냐에 따라 포인.. 2022. 4. 14. [ C언어 ] 프로젝트(삽질일기) : 도서 관리 프로그램 - (1) - 구조체 배열 book.h #ifndef __BOOK_H__ #define __BOOK_H__ #define SIZE 20 typedef struct { char year; char month; char day; }_stDate; typedef struct { char title[30]; int price; char author[10]; int page; _stDate date; } _stBook; char DispMenu(char num); char CountData(_stBook list[]); char AddBook(_stBook list[], char num); void PrintBook(_stBook list[], char num); char RmBook(_stBook list[], char num); voi.. 2022. 4. 12. [ C언어 ] 중복없이 난수생성 / 랜덤값 뽑기 / 로또번호 생성 / 선택정렬 (rand, srand, time 함수) 1. stdlib.h, time.h 헤더파일 포함하기 #include #include 2. 메인함수 안쪽 상단에 srand((unsigned)time(NULL)); 를 한번만 사용 srand((unsigned)time(NULL)); 진정한 의미의 난수생성을 위해 time을 seed값으로 넣어주는 부분, 간혹 컴파일 에러가 뜨는 경우가 있어 unsigned로 캐스팅해준다고 한다. 3. rand() 함수와 % 나머지연산자를 활용하여 랜덤값 생성 예를들어, 0~9 사이의 난수생성을 원한다면 rand()%10 1~10 사이의 난수생성을 원한다면 (rand()%10)+1 4. 중복없이 난수 뽑기 만약 뽑아야할 난수의 갯수가 많지 않다면 이런 방법도 있다. for (;;) { a = rand() % 10; b = .. 2022. 4. 4. 이전 1 2 3 다음