월 19,800원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨홍정모의 따라하며 배우는 C언어
버퍼가 헷갈려요
int get_integer() { int input; char c; while (scanf("%d", &input) != 1) { while ((c = getchar()) != '\n') putchar(c); printf(" is not an integer.\n Please try again : "); } return input; }제가 맞게 이해한건지 모르겠는데여기서 putchar(c)에 들어가는건 while (scanf("%d", &input) != 1)에서 scanf의 형식지정자가 맞지않아 뱉어낸 버퍼에 남아있던 값이 맞나요?
- 미해결홍정모의 따라하며 배우는 C언어
(1:40) flexible array member을 갖는 구조체, 스택 vs 힙 메모리 위치가 궁금합니다.
★작성하다보니 글이 길어졌는데, 번호로 굵은 표시해놓은 부분과 그림만 살펴봐주셔도 될 것 같습니다.--------------------#define CRTSECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>int main(){/*Flexible array member (struct hack in GCC)*/struct flex{size_t count;double average;double values[]; //flexible array member (last member!)};const size_t n = 3;printf("%zd\n", sizeof(float));struct flex* pf = (struct flex*)malloc(sizeof(struct flex) + n * sizeof(double));if (pf == NULL) exit(1);printf("%lld\n", (long long)pf);printf("%lld\n", (long long)&pf->count);printf("%zd\n", sizeof(pf->count));printf("%lld\n", (long long)&pf->average);printf("Address of pf->values %lld\n", (long long)&pf->values);printf("Value of pf->values %lld\n", (long long)pf->values);printf("Sizeof pf->values %zd\n", sizeof(pf->values));pf->count = n;pf->values[0] = 1.1;pf->values[1] = 2.1;pf->values[2] = 3.1;pf->average = 0.0;for (unsigned i = 0; i < pf->count; ++i)pf->average += pf->values[i];pf->average /= (double)pf->count;printf("Average = %f\n", pf->average);현재 구조체 flex는 main함수 내에서 선언하여 스택 메모리에 위치하고 있습니다.구조체 flex의 멤버 size_t형 count와 double형 average는 구조체 포인터가 선언됨과 동시에 스택에 메모리 공간을 차지하였습니다.구조체 flex의 마지막 멤버는 가변길이 배열(flexible arrays)으로서 동적할당으로부터 변수를 통해 크기를 할당받는다고 이해했습니다.Q1. 구조체 포인터를 선언할 때 struct flex* pf;라고 하는데, 이때 pf는 내부적으로 구조체 flex의 데이터들을 가리키는 것인지 궁금합니다.: 이 순간부터 pf는 구조체 flex와 관련이 있는것인가요? 관련이 있다면 어떤 것인가요?*지금까지 너무 자연스럽게 Q1-1처럼 struct 구조체Tag를 하나의 자료형으로만 생각해왔습니다.Q1-1. 단순히 struct flex라는 것은 하나로 묶어 (구조체를 다루는) 하나의 자료형으로 취급하는 것이 아닌가요?Q2. 스택 내에 구조체 flex에 대한 메모리 공간, 구조체 포인터 pf에 대한 메모리 공간 서로 따로 존재하며구조체 포인터 pf가 동적할당받은 메모리 주소를 가리킨다고 이해했습니다.*사진 첨부그런데 어떻게 구조체 포인터 pf를 통해 스택에 있는 구조체 멤버인 count와 average에 접근할 수 있는 것인지 잘 모르겠습니다.Q3. 구조체 flex의 멤버인 배열 values가 동적할당 메모리를 이용한 가변길이 배열로 설정하기 위함이라면동적할당을 받을 때, 배열이 필요로하는 n * sizeof(double)만 할당받아오면 됐을 것 같은데sizeof(struct flex)를 추가로 받아오는 이유가 궁금합니다.+구조체 포인터 pf를 통해 count와 average에 접근할 수 있던 것과 관련이 있을 것 같습니다.--------------------: 앞에서 말씀하셨듯 구조체 포인터 pf는 'flex라는 Tag를 갖는 구조체 변수'의 포인터'라고 하는데 Tag는 모든 멤버의 데이터를 담고있는 것인가요?구조체 멤버 또는 구조체 포인터가 선언됨에 따라 구조체의 멤버들은 메모리 공간을 할당받고구조체 포인터를 ->연산자를 통해 멤버에 접근할 수 있다는 것은 이해했습니다.(Q2)※다만 제가 여기서 궁금한 것은 구조체 포인터에 단순히 동적할당 받은 힙 메모리의 주소를 대입했음에도어째서 동적할당 메모리를 가리키는 포인터 pf를 통해 멤버에 접근이 가능한지..입니다.
- 미해결홍정모의 따라하며 배우는 C언어
(강의10:01) 런타임 에러 발생하는 이유
이정도까지만 작성한 후, 처음 엔터를 입력했을 때 정상적으로 반복문을 빠져나가 프로그램을 종료하는지 알아보기 위해 실행해보았습니다.컴파일 에러는 없었고 정상적으로 빌드되어 실행되었는데,왜 런타임 에러가 발생하는지 이유를 모르겠습니다.[수정] 코드를 전체 다 작성했음에도 똑같이 런타임 에러가 발생합니다..ㅠㅠ#define CRTSECURE_NO_WARNINGS#include <stdio.h>#include <limits.h>#define MAX_TITLE 40#define MAX_AUTHOR 40#define MAX_BOOK 3char* s_gets(char* st, int n){ char* ret_val; char* find; ret_val = fgets(st, n, stdin); if (ret_val) { find = strchr(st, '\n'); if (find) * find = '\0'; else while (getchar() != '\n') continue; } return ret_val;}struct book{ char title[CHAR_MAX]; char author[CHAR_MAX]; float price;};int main(){ struct book bk[MAX_BOOK] = {"Empty", "Empty", 0.0f}; int count = 0; int i; for (i = 0; i < MAX_BOOK; i++) { printf("Input a book title or press [Enter] to stop\n"); if (s_gets(bk[i].title, MAX_TITLE) == NULL) break; //EOF를 만나 NULL을 반환했을 때 (예외처리) if (bk[i].title[0] == '\0') break; printf("Input the author.\n"); s_gets(bk[i].author, MAX_AUTHOR); printf("Input the price.\n"); int flag = scanf("%f", &bk[i].price); while (getchar() != '\n') continue; //getchar() != '\n'는 입력 버퍼 내의 개행을 지우는 역할. 꺼내어서 비교? == 버퍼에서 소거 if (i == 2) printf("No more books.\n"); count++; } if (count > 0) { printf("\nThe list of books:\n"); for (i = 0; i < count; i++) printf("\%s\" written by %s: $%.1f\n", bk[i].title, bk[i].author, bk[i].price); } else printf("No books to show.\n"); return 0;}
- 미해결홍정모의 따라하며 배우는 C언어
C언어 자료구조
안녕하세요 강의 수강 중 문의드립니다. 비전공자로 C언어로 자료구조를 배우라는 말씀을 듣고 현재 수강중입니다. 파이썬이 어떤 언어인지까지만 배운 상태에서 C언어 수업을 들었습니다. 궁금한 점은, C언어를 통한 자료구조가 프로그램 개발에 있어 어떤 방식으로 도움이 되는건지 궁금하고, 또 제가 집중하여 이해해야할 부분을 알고 싶습니다. 수고하세요
- 미해결홍정모의 따라하며 배우는 C언어
배열, 포인터 주소 관련
#include <stdio.h> int main() { //배열의 이름은 배열의 첫번째 인덱스 주소 int arr1[] = { 101, 102, 103 }; int arr2[] = { 104, 105, 106 }; printf("%p, %p, %p\n", &arr1, arr1, &arr1[0]); int arr3[2][3] = { {1,2,3},{4,5,6} }; printf("%p, %p, %p\n\n", &arr3, arr3, &arr3[0]); //포인터의 이름은 할당된 주소 //&포인터는 포인터도 변수니까 그에 대한 주소(자료형에 관계 없이 메모리 주소 사이즈) int* prt = arr1; printf("%p, %p, %p\n", &prt, prt, arr1); int* parr[2] = {arr1[0],arr2[1]}; printf("%p, %p, %p\n", &parr, parr, arr1); return 0; }안녕하세요.10.14 강의 내용 질문은 아니지만 이 강의부터 진도를 못나가고 있어요 ㅠ'이름'에 대한 강조가 많아 혼란스러워 질문 드립니다.1.&배열이름($arr1)에서 배열 이름이 주소인데 앞에 &을 붙여 사용하는 경우도 있나요?사용할 경우 그냥 arr1과 같은 주소 나오는 건가요?2.포인터에서 &prt와 prt 차이는포인터도 변수니까 그에 대한 주소와포인터에 할당된 주소 차이로 봐도 될까요?3.그런데 포인터[] 배열에서는 &parr, parr의 주소 같게 나오는데 이유가 궁금합니다. 이 주소는 변수 주소인가요?늘 감사합니다.
- 해결됨홍정모의 따라하며 배우는 C언어
(10:57) 바이너리 함수의 데이터 내용
안녕하세요. 강의 13.5 10: 57 부근에 대한 질문입니다.교수님께서 강의를 진행하시는 대로 그대로 코드를 작성하고 실행하였으나, 0부터 144짜지 2의 간격으로 깔끔하게 출력되던 교수님의 결과창과 달리 제 출력 결과는 마치 주소값을 나타내듯 불규칙한 -값의 연속, 그리고 중간중간 0과 정수 등이 섞여있는 결과를 보여주었습니다.바이너리 파일이 2진 데이터 그대로의 파일이기 때문에, 파일 내부에 어떠한 값이 들어있을지는 출력해보기 전까지 모르고또 출력되더라도 다른 컴퓨터의 결과와 완전히 동일한 결과가 출력되지 않을 수 있는 것이 정상인가요?혹시 제가 코드를 잘못 작성했는지 비교해보았으나 그런 것 같지는 않습니다.
- 미해결홍정모의 따라하며 배우는 C언어
2:28초 질문입니다.
교수님이 입력하신 대로 그대로 입력하고 디버깅 해보면B 1 2 를 입력한 뒤에 c의 값은 공백이고 cols값은 3 rows 값은 3입니다. 왜 cols값과 rows값이 3인지 이해가 안됩니다.scanf함수와 getchar함수를 만났을 때 입력을 받을 때와 입력을 받지 않고 다음 라인으로 바로 건너 뛰는 경우도 있는데 왜 그런 걸까요?
- 미해결홍정모의 따라하며 배우는 C언어
(19:50) 동적할당 메모리 반납
강의 19:50부분입니다.동적할당 메모리는 힙으로부터 메모리를 할당받은 후, 다 사용을 했으면 그 할당받은 메모리를 꼬박꼬박 free( )로 반납해야한다고 이해했습니다.그런데 강의에서 교수님께서 말씀하시길, "free( )를 한, 동적할당 메모리를 가리키는 포인터 ptr이라도, 더이상 어떠한 동적할당 메모리도 가리키고 있지 않음을 표현하기 위해 NULL을 대입해주는 것이 좋다"라고 하셨습니다.1. 동적할당으로 240bytes를 할당받고나서,37번 문장 free(ptr);을 했음에도 다시 NULL로 가리키는 데이터가 없음을 확실히 나타내줘야 한다는 것이 물론 선택사항이긴 하지만힙(heap)에 할당받은 240bytes는 어딘가 아직 반납되지 않고 존재한다는 것인가요?
- 미해결홍정모의 따라하며 배우는 C언어
2:09초 디버깅 해보는데 도와주세요
Buffer값을 상상하면서 디버깅 해보고 있는데 어느 방식으로 동작하는지 모르겠습니다.입력 : A 3 3 Buffer : [' ', \n] c : 'A' rows : 3 cols : 3입력: B 1 2 Buffer : [\n, B, 1, 2, \n] c : ' ' rows : 3 cols : 3Buffer에서 ' ' 가져와서 c가 ' ' 것은 알겠지만rows와 cols 값이 3인지 이해가 안됩니다.입력 : Buffer : [B, 1, 2, \n] c : 'B' rows : 1 cols : 2왜 입력을 받지 않는지 궁금합니다.
- 미해결홍정모의 따라하며 배우는 C언어
_getch() _getche() 함수 질문
_getch() 함수로 qwer 입력한 뒤 enter를 입력하면 커서가 q로 이동하는 이유를 모르겠어요. \n을 만났다면 줄 바꿈이 되어야 하는 게 아닌가요??#include <stdio.h> #include <conio.h> //windows int main() { char c; //버퍼사용안하고 한글자씩 입력받을 때 사용 //_getch() : 사용자가 무엇을 입력하고 있는지 콘솔에 표시안됨 //_getche() : 사용자가 무엇을 입력하고 있는지 보여주고 한글자입력할때마다 출력함 while ((c = _getch()) != '.') putchar(c); //콘솔에서 getchar() 한글자씩 입력받을때 //\n전까지 또는 Buffer가 가득 찰때까지 일단 Buffer에 전부 저장함 //putchar()는 Buffer에 저장된 값을 Buffer에 값이 없을 때 까지 Buffer의 값을 차례대로 출력함 //while ((c = getchar()) != '.') // putchar(c); return 0; }
- 미해결홍정모의 따라하며 배우는 C언어
Boolean을 만들어서 사용하는 이유가 뭐에요?
그냥 변수명을 int true = 1, false = 0;이라고 지어서 printf("True is %d\n",true); printf("False is %d\n", false);이렇게 출력하는거랑 똑같지 않나요?왜 사람들이 bool타입을 만들어서 사용하는건가요?
- 미해결홍정모의 따라하며 배우는 C언어
fabs() 사용 관련 질문이 있습니다.
본 강의에서 사용된 fabs() 말인데요.fabs()를 사용하지 않고그냥 while ((guess - PI) > 0.01)이라고 코드를 짜면왜 제대로 돌아가지 않는건가요?guess도 PI도 다 double로 선언되어 있으니까 두 변수를 뺀 값도 double 타입을 가져서 소수점 자리수가 상세하게 저장되지 않나요? 그래서 (guess - PI) > 0.001이 제대로 계산될 줄 알았는데, fabs를 사용하지 않으면 결과값이 제대로 출력되지 않네요...?
- 미해결홍정모의 따라하며 배우는 C언어
(강의 10:21) 배열의 이름 dest에 "Start something"을 대입하는 것이 안되는 이유
강의 10: 21부분입니다.교수님께서 61번째 문장 dest = "Start something"; //Error에서 에러가 발생한다고 말하셨는데, 어째서 에러가 발생하게 되는 것인지 잘 모르겠습니다.error C2106: '=': left operand must be l-value빌드를 실행해보면 왼쪽은 l-value로서 작동해야한다고 합니다.이미 공간(주소)을 할당받은 배열 dest가 있고,배열의 이름 dest, 즉 포인터에다가, (수정불가능한/읽기만 가능한 프로그램 코드에 있는) "Start something"이라는 문자열의 주소를 대입함으로서 그걸 수정(?)하려 시도했기에 에러가 발생하는걸까 싶기도 하고.. 머릿 속의 개념이 꼬여버렸습니다.※그치만 이것이 안되는 경우는,'포인터로 정의한 문자열이 있을 때 포인터를 통해 인덱싱하여 값을 수정하려고 했을 때" 문제가 발생하는 경우였습니다.이번 dest = "Start something"; //Error의 경우에 해당하진 않을 것 같습니다.
- 미해결홍정모의 따라하며 배우는 C언어
(11:00) 코드를 실행했을 때 이상한 결과가 막 출력됩니다.
11.5강의 11:00부분입니다.void custom_put(const char* str); //Only two linesint custom_put2(const char* str); //Add \n, return # of charactersint main(){/* Custom function */ custom_put("Just "); custom_put("Do it!"); printf("%d\n", custom_put2("12345")); return 0;}void custom_put(const char* str){ while (*str != '\n') //while(*str) putchar(*str++);}int custom_put2(const char* str){ int count = 0; while (*str) { putchar(*str++); count++; } putchar('\n'); return count;}교수님께서 작성하셨던 코드 그대로 다 입력을 했습니다.빌드를 실행하면 정상적으로 빌드가 되는데, 콘솔창에서 정말 이상한 값들만 자동으로 쫙 출력됩니다.이게 어떤 원인때문에, 이렇게 발생한 문제인지 알고 싶습니다.
- 미해결홍정모의 따라하며 배우는 C언어
scanf()
int sum = i + j; 를 scanf 해주기 전, 저 같은 경우는 i, j를 초기화 해준 바로 다음에 작성해줬는데 이 때 scanf를 통해 입력 받은 값의 합이 할당되는 것이 아닌 초기화 된 값의 합을 할당받는 것을 보았습니다. 코드를 사용하는 순서가 달라지면 왜 결과가 이렇게 변하나요?
- 해결됨홍정모의 따라하며 배우는 C언어
(강의 6:00) 문자열을 입력할 때에도 내부적으로 뒤에 \0이 붙나요?
코드를 실행해보면 위와 같다.처음에 char타입 배열 words를 선언하고, 그 공간에 "hello world\n"를 입력하면gets( )함수가 한번에 버퍼를 읽어들인 뒤 내부적으로 \n을 제거하고(받지않고) \0를 추가시켜서 "hello world\0"를 배열 words에 저장한다."START\n"가 출력되고"hello world"가 출력되고바로 이어서 "hello world"가 출력된 뒤 줄바꿈(\n)이 된다.마지막으로 "END"가 출력된다.1. 강의 6:00 부분입니다. 제가 위에 작성한 것처럼 내부적으로 처리되는 과정을 적어보았는데, 여기서 생긴 궁금한 부분이 "문자열을 입력했을 때에도 내부적으로 뒤에 \0를 붙여서 처리해주는가?"입니다.보통 코드 상으로 어떤 char타입의 배열을 선언하고 거기에 문자열을 대입한다고 했을 때 자동적으로 내부적으로는 뒤에 \0이라는 null character가 붙습니다.그런데 이것이 콘솔 창에서 입력해주었을 때도 마찬가지로, 내부적으로 입력한 문자배열+\0으로 처리해주는지 궁금합니다.만약 그렇다면, gets( )함수가 words를 입력받고 \n가 입력되는 순간, "hello world\0+\0"으로 저장이 될 것입니다.2. 콘솔창에 printf( )함수로든 puts( )함수로든 출력이 될 때, 문자열에 (내부적으로 저장되어있는) null character(\0)도 마찬가지로 입출력 버퍼에 저장되는 것은 동일한데출력 시 콘솔 창에 표현이 안되고단순히 hello worldhello world로 표시가 되는것인지 궁금합니다.이것이 사실 콘솔창에 \0도 출력되는 것이지만, 공백이 아니라 말그대로 null character이기 때문에 표시되지 않는 것처럼 보이는 건가요?
- 미해결홍정모의 따라하며 배우는 C언어
복합 리터럴에 대한 visual studio의 자동완성이 이상합니다.
강의 ~4:30 초반부 부분에 보여주시는복합 리터럴은 (int[2]) {3, 4};이렇게 작성하셨습니다.그런데 제가 코드를 입력할 때 세미콜론까지 입력하고 엔터를 치면 자동으로 위와같이 변합니다.물론 컴파일러는 빈칸을 없는 것과 마찬가지로 취급해서 교수님의 코드나 제 코드 모두 컴파일러가 인식하는데 차이는 없을 것입니다.다만 저는 왜 자동완성으로 저렇게 줄바꿈 처리가 되는지 잘 모르겠습니다. 왜 그런지 알 수 있을까요?
- 미해결홍정모의 따라하며 배우는 C언어
(1.9)강의 소스파일이 없다고 뜹니다
studio.h 소스파일이 없다고 떠서 못하는 중입니다.. 어케해야됄까요
- 미해결홍정모의 따라하며 배우는 C언어
잘 모르겠어요
왜 Enter next integer (q to quit) : 두 번 출력 되고 Sum 값이 이상하게 출력 되는지 잘 모르겠습니다..#include <stdio.h> int main() { int sum = 0; char input = ' '; printf("Enter an integer (q to quit) : "); scanf("%c", &input); if (input != 'q') { sum += (int)(input - 48); while (1) { printf("Enter next integer (q to quit) : "); scanf("%c", &input); if (input == 'q') break; sum += (int)(input - 48); } } printf("Sum = %d", sum); return 0; }
- 미해결홍정모의 따라하며 배우는 C언어
(강의 4:49) 포인터 변수 ptr이 어떤 식으로 data[2][3]에 접근하는지 모르겠습니다.
포인터 변수 ptr이 어떤 원리로 *(ptr + 3 + COLS * 2)에 접근하는지 모르겠습니다.printf("%d\n", data[2][3]);int* ptr = &data[0][0];printf("%d\n", *(ptr + 3 + COLS * 2));위의 data[2][3]을 포인터 연산을 통해 접근한다.*(ptr + 3 + COLS * 2)에서 Row 숫자가 2로 들어가고, 그 다음 COLUMN의 개수를 곱하고Column의 인덱스를 더하고 포인터변수 ptr로 접근하면 마치 1차원 배열로 2차원 배열에 접근할 수 있다.라고 하셨었는데, *(ptr + 3 + COLS * 2)는 내부적으로 COLS * 2가 먼저 계산되어 *(ptr + 3 + 8)이 되고,그 다음 *(ptr + 11)이 되어서 결과적로 data[0][11]에 접근하게 되는게 아닌가 싶습니다.*(ptr + 3 + COLS * 2)가 최종적으로 data[2][3]으로 접근하게되는 과정을 설명해주시면 감사하겠습니다.