월 19,800원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨홍정모의 따라하며 배우는 C언어
강의 내용 중 주석 Cannot change heart. Can change ...
강의 20분 중반대부터 보이는 // Cannot change heart. Can change the elements of heart가 이해가 가지 않습니다.heart는 배열이여서 바꿀 수 있다고 생각했는데 (바로 뒤에 요소 수정 가능이라고 나와있긴 해서 헷갈림)// Cannot change head.를 의도했는데 잘못 표기된 것인지 아니면 heart라는 배열의 이름에 접근할 수 없다는 뜻인지 모르겠습니다.감사합니다
- 미해결홍정모의 따라하며 배우는 C언어
4분경 질문
사진처럼 오류가 뜨면서 디버그가 안 된다고 하는데 어디가 문제인지 잘 모르겠어요. 오류 내용 보면 저장 위치랑 관련 있는 것 같은데 이리저리 뭘 해봐도 잘 안 되네요
- 미해결홍정모의 따라하며 배우는 C언어
강의와 다름
화면과 똑같이 코딩을 했는데 실행을 하면 Hello, world가 뜨는 게 아니라 그냥 검은 빈 화면만 뜨는데 뭐가 잘못된 건가요? 마지막 부분에서 F10 눌러도 Hello, world가 뜨는 게 아니라 똑같이 그냥 빈 화면만 뜨네요.
- 해결됨홍정모의 따라하며 배우는 C언어
double d = 0.0;으로 초기화하는 이유
위에서 다른 값들은 입력할 때 초기화를 시키지 않았는데 double d만 값을 초기화하는게 궁금합니다. 제 생각을 말씀드리면 앞의 예제들을 실행시켰을 때 값을 입력하지 않았음에도 어떠한 값이 이미 출력되더라구요. 이게 혹시 초기화를 시키지 않아서 발생했던 문제들인가요??
- 해결됨홍정모의 따라하며 배우는 C언어
9분 48초 (*(parr + 1))[1] 이게 이해가 잘 안되네요
(*(parr + 1))[1]을 제가 해석해보자면parr은 arr0을 가리킨다. 거기에 1을 더하면 arr1을 가리키게 된다.거기에 *를 붙이면 arr1이 가리키는 arr1[0]을 가리키게 된다.여기에 [1]를 붙이면? arr1[0][1]을 가리키게 되나? 아니면 arr1[1]을 가리키게 되나? 아니면 arr1[1]이 되나?출력값이 5인걸 보면 맨 오른쪽인것 같은데(*(parr + 1))은 &arr1[0]이고 거기에 [1]을 붙인다는 게 정확하게 무슨 뜻 인가요?어떤 식으로 작동하는건지 이해가 잘 안되요. parr[0]은 &arr0[0]이고parr[0][0]은 arr0[0]이다.라는 것과 비슷하게 작동하는 건가요? 항상 좋은 답변 감사합니다.
- 해결됨홍정모의 따라하며 배우는 C언어
14.26강 연습문제 질문이 있습니다.
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <ctype.h> #include <stdlib.h> #include <stdbool.h> void update_string(char*, int(*)(int)); void ToUpper(char*); void ToLower(char*); void Transpose(char*); // TO DO : add a new menu int main(void) { char options[] = { 'u', 'l' }; int n = sizeof(options) / sizeof(char); // 함수 포인터의 배열 typedef void (*FUNC_TYPE)(char*); FUNC_TYPE operations[] = { ToUpper, ToLower }; printf("Enter a string\n>> "); char input[100]; while (scanf("%[^\n]%*c", input) != 1) printf("Please try again.\n>> "); printf("Choose an options:\n"); printf("u) to upper\n"); printf("l) to lower\n"); char option_choice; while(scanf("%[^\n]%*c", &option_choice) != 1) printf("Please try again.\n>> "); // 선택한 옵션에 따라 대문자/소문자로 변경 // options 배열을 순회하며 options에서 선택한 옵션의 index 추출 int option_choice_index = 0; for (int i = 0; i < n; ++i) { if (options[i] == option_choice) { option_choice_index = i; break; } } // 문자열 변경 함수 실행 update_string(input, operations[option_choice_index]); // 문자열 출력 puts(input); return 0; } // 문자열 전체를 대문자/소문자로 변경하는 함수 void update_string(char* str, int(*ptr_func)(int)) { char* arg1 = str; int(*arg2)(int) = ptr_func; (*ptr_func)(str); }; // 문자열 전체를 대문자로 변경하는 함수 void ToUpper(char* str) { char* arg3 = str; while (*str != '\0') { *str = toupper(*str); str++; } }; // 문자열 전체를 소문자로 변경하는 함수 void ToLower(char* str) { while (*str != '\0') { *str = tolower(*str); str++; } }; update_string 함수에서(*ptr_func)(str);를 실행할 때까지 str의 주소가 잘 잡힙니다.그런데 (*ptr_func)(str);를 실행해서 ToUpper 함수 안으로 진입하면 str의 주소가 잡히지 않는데 왜 이런지 잘 모르겠습니다..
- 미해결홍정모의 따라하며 배우는 C언어
8분 40초경 질문
int sum2d_2(int ar[][COLS], int row);에서 COLS 자리의 인덱스에 숫자를 적어주는 이유는ar이라는 포인터의 행의 사이즈는 int * (COLS 자리의 인덱스) 이기 때문이다.라고 해봤는데 이게 맞거나 비슷한 표현 일까요?제 표현이 틀린 것 같아 답변자 분이 이해를 할 수 없을 것 같기도 하네요.. ㅈㅅ함미다.
- 해결됨홍정모의 따라하며 배우는 C언어
6분 54초경 질문
그냥 그렇나 보다 하고 지나칠뻔한 걸 한번 의심을 하니 문제를 놓을 수가 없게 되었습니다. 1.int ar1[2][3] = { {1, 2, 3}, {4, 5, 6} };int* pt;pt = &ar1[0][0];for (int i = 0; i < 6; ++i)printf("%d %d ", pt[i], *(pt + i)); 2.int arr[2][3] = { {1, 2, 3}, {4, 5, 6} };int* parr[2];parr[0] = arr[0];parr[1] = arr[1];for (int i = 0; i < 2; ++i)printf("%p %p ", parr[i], *(parr + i)); 둘 다 똑같이 출력을 했는데 1번 예제는 값이, 2번 예제는 주소가 출력 되는 이유그러니까 parr[i]가 주소를 출력하니 pt[i]도 주소를 출력 해야 할 것 같은데 값을 출력하는 이유가 궁금합니다.parr은 포인터의 배열이고 pt는 포인터라서?parr의 자료형은 int (*)[3]이고 pt의 자료형은 int*라서?뭔가 연관이 있을 텐데 저는 어떤 연관이 있는 건지 쉽사리 연결 지을 수가 없더라구요.꼭 알려주셨으면 합니다. 항상 좋은 답변 감사합니다.
- 미해결홍정모의 따라하며 배우는 C언어
릴리즈모드 디버그모드 scnaf 오류
릴리즈 모드가 아니라 디버그 모드를 사용해서 i와j의 합을 볼려했는데 왜 디버그 모드상태에서 scanf를 사용하면 오류가 나나요??
- 해결됨홍정모의 따라하며 배우는 C언어
14.24강 09:54 질문이 있습니다.
앞에 말씀하신 부분 중 함수 실행의 결과로 배열을 반환할 수 없다고 하셨었는데 그러면 09:54에서 식별자 x2는 함수 포인터 배열의 포인터가 되는건가요???int(*x2[10])(int);
- 해결됨홍정모의 따라하며 배우는 C언어
scanf()의 작동 원리(?)에 관한 질문 (따배C - 8.7)
#include <stdio.h> int main() { /* Assume that your input is : Hello 123 3.14 */ char str[255], tmp; int i = 0, i2 = 0; double d = 0.0; scanf("%s %d %lf", str, &i, &d); // POINT1 printf("%s %d %f\n", str, i, d); // or (see the difference) scanf("%c", &tmp); // POINT2 printf("My input was %c!!!\n", tmp); // POINT2_1 scanf("%s %d %d", str, &i, &i2); // POINT3 printf("%s %d %d\n", str, i, i2); // or (see the difference) char c; while ((c = getchar()) != '\n') putchar(c); printf("\n"); return 0; }안녕하세요 강의를 듣다가 평소에는 무심코 지나쳤던 부분이 눈에 밟혀 질문 드립니다.POINT1에 정상적인 값들을 입력하고 Enter를 누르면 POINT2에서 '\n'이 입력되고 POINT2_1에서 '\n'이 출력된 것을 확인했습니다.그렇다는 것은 버퍼에 '\n'이 남았다는 것을 알 수 있습니다.여기서 궁금증이 생겼습니다.POINT2, POINT2_1을 지우고 실행하면 왜 POINT3에서 정상적인 값들을 입력했을 때 str에 '\n'이 입력되지 않는지 궁금합니다.처음에는 printf() 함수가 알아서 버퍼를 비워주나 생각했었지만 POINT2, 2_1을 통해 그건 아니라는 것은 확인했습니다.그래서 제 딴에 생각한 것은'scanf() 함수에서 여러 개의 값들을 입력 받으면 (한 개의 값만 입력 받을 때와 달리) 버퍼에 남아있던 '\n'을 자동으로 무시해 주는 것이다.'인데 이것이 맞는지 궁금합니다.
- 미해결홍정모의 따라하며 배우는 C언어
10.2강 20:39 sizeof 배열명
sizeof(power_of_twos)에서 power_of_two를 왜 주소로 인식하지 않는 것인가요?저는 power_of_twos를 배열명, 즉 주소 상수라고 생각해서 4byte가 나올 것으로 예상했습니다.
- 해결됨홍정모의 따라하며 배우는 C언어
strcpy() 함수 질문
안녕하세요.#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> int main() { /* strcpy() and strncpy() */ // 1 char dest[100] = ""; // make sure memory is enough char source[] = "Start programming!"; //dest = source; // Error //dest = "Start something"; // Error strcpy(dest, source); puts(dest); return 0; } 라는 코드에서 주석 처리된 "dest = source;"과 "dest = Start something;"의 오류가 "expression must be a modifiable lvalue"임을 확인했습니다.이는 dest가 배열의 이름이며, 배열의 이름은 메모리 갖지 않기 때문에 나타나는 오류인가요?또 strcpy() 함수를 사용하지 않고 배열 dest에 source의 문자열을 넣으려면 다음처럼 코드를 작성하면 될까요?#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> int main() { /* strcpy() and strncpy() */ // 1 char dest[100] = ""; // make sure memory is enough char source[] = "Start programming!"; for (int i = 0; i < strlen(source); i++) dest[i] = source[i]; puts(dest); return 0; }
- 해결됨홍정모의 따라하며 배우는 C언어
strcmp() 함수 문자열 비교
안녕하세요 강의를 듣고 궁금한 점이 생겨 질문 드립니다.strcmp() 함수가 문자열을 비교할 때 1 혹은 -1을 출력하는 기준이 아스키코드라고 알고 있습니다.Bananas와 Banana를 비교했을 때, 둘의 순서를 바꿈에 따라 값이 다르게 출력되는 것을 확인했습니다.단일 문자는 첫 번째 인수의 아스키코드가 더 작으면 -1이 더 크면 1이 출력되는 것은 이해했습니다.그런데 문자열은 어떤 방식으로 -1과 1이 출력되는지 잘 모르겠습니다.늘 친절한 답변 감사합니다.
- 미해결홍정모의 따라하며 배우는 C언어
4분 45초경 질문
arr과 arr[0]모두 arr[0][0]을 가리키지만arr의 타입은 int (*)[3]이고arr[0]의 타입은 int* 이다.따라서 arr + 1은 &arr[0] + 1이고arr[0] + 1은 &arr[0][0] + 1이다.이게 맞나요? arr과 arr[0] 모두 arr[0][0]을 가리키는데포인터 산술 연산을 하면 결과가 다르게 나와서 헷갈렸는데수박 선생님이 전에 답변해 주신 걸 보고 나름 이해를 해봤어요선생님이 아마 arr과 arr[0]의 자료형이 다르다고 하셨던 거 같은데 맞나요?그 때 답변을 봐도 제가 이해한 게 맞는 건지 확신이 안 드네요.
- 미해결홍정모의 따라하며 배우는 C언어
매개구조체 포인터?없이 이중포인터로 원래 구조체접근
안녕하세요 이 글은 제가 오개념을 가지고 그냥 운좋게 실행되는 코드를 짜낸것인지 좀 불안한 마음이 역력해서 드리는 질문글입니다. 10:51 부분이며 교수님께서 짜신 read_books2함수는 (포인터가 널인지 아닌지 체크하는 유효성 검사 코드 같은 것들은 생략했습니다)void read_books2(const char* filename, struct book** books_dptr, int* n_ptr) { FILE* fp = fopen(filename, "r"); fscanf(fp, "%d%*c", n_ptr); struct book* books = (struct book*)calloc(*n_ptr, sizeof(struct book)); for (int i = 0; i < *n_ptr; ++i) { fscanf(fp, "%[^\n]%*c%[^\n]%*c", books[i].name, books[i].author); } fclose(fp); *books_dptr = books; }이고, 제가 작성한 코드는void read_books2(const char* filename, struct book** books_dptr, int* n) { FILE* fp = fopen(filename, "r"); fscanf(fp, "%d%*c", n); *books_dptr = (struct book*)calloc(*n, sizeof(struct book)); for (int i = 0; i < *n; ++i) { fscanf(fp, "%[^\n]%*c%[^\n]%*c", (*books_dptr)[i].name, (*books_dptr)[i].author); } fclose(fp); }입니다. 전체코드는 맨 아래에 있습니다. 교수님께서는 함수 내부에 새로운 구조체 포인터*books를 만들어서 파일로부터 읽어들인 값들을 정리했고 그 구조체의 주소값을 *books_dptr = books를 통해 원래 main함수 안에 있던 my_books로 직접 넘겨주셨습니다. 그런데 저는 매개없이 가져온 주소에 직접 *books_dptr = (struct book*)calloc(*n, sizeof(struct book));이렇게 메모리를 조정해줬고 (교수님께서는 = 좌변에 직접 새로운 구조체 포인터를 만드셨습니다) 후에 fscanf(fp, "%[^\n]%*c%[^\n]%*c", (*books_dptr)[i].name, (*books_dptr)[i].author);처럼 txt파일로부터 읽은 것을 함수매개변수를 통해 가져온 주소에 직접 가서 값을 넣었습니다. 혹시 이 방식에서 우려하실 부분은 없으실까요? 감사합니다. #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <conio.h> #define SLEN 101 #define FILE_NAME "books.txt" struct book { char name[SLEN]; char author[SLEN]; }; void print_books(const struct book* books, int n); void write_books(const char* filename, const struct book* books, int n); struct book* read_books(const char* filename, int* n); void read_books2(const char* filename, struct book** books_dptr, int* n); int main() { int temp; int n = 3; struct book* my_books = (struct book*)malloc(sizeof(struct book) * n); if (!my_books) { printf("malloc() has failed"); exit(EXIT_FAILURE); } my_books[0] = (struct book){ "The Great Gatsby", "F. Scott Fitzgerald" }; my_books[1] = (struct book){ "Hamlet", "William Shakespeare" }; my_books[2] = (struct book){ "The Odyssey", "Homer" }; print_books(my_books, n); printf("\nWriting to a file...\n"); write_books(FILE_NAME, my_books, n); free(my_books); n = 0; printf("Done.\n"); printf("\nPress any key to read data from a file.\n\n"); temp = _getch(); read_books2(FILE_NAME, &my_books, &n); //my_books = read_books(FILE_NAME, &n); print_books(my_books, n); free(my_books); n = 0; return 0; } void print_books(const struct book* books, int n) { for (int i = 0; i < n; ++i) { printf("Book %d : \"%s\" written by \"%s\"\n", i + 1, books[i].name, books[i].author); } } void write_books(const char* filename, const struct book* books, int n) { FILE* fp = fopen(filename, "w"); fprintf(fp, "%d\n", n); for (int i = 0; i < n; ++i) { fprintf(fp, "%s\n%s\n", books[i].name, books[i].author); } fclose(fp); } struct book* read_books(const char* filename, int* n) { FILE* fp = fopen(filename, "r"); fscanf(fp, "%d%*c", n); struct book* lits = (struct book*)calloc(*n, sizeof(struct book)); for (int i = 0; i < *n; ++i) { fscanf(fp, "%[^\n]%*c%[^\n]%*c", lits[i].name, lits[i].author); } fclose(fp); return lits; } void read_books2(const char* filename, struct book** books_dptr, int* n) { FILE* fp = fopen(filename, "r"); fscanf(fp, "%d%*c", n); *books_dptr = (struct book*)calloc(*n, sizeof(struct book)); for (int i = 0; i < *n; ++i) { fscanf(fp, "%[^\n]%*c%[^\n]%*c", (*books_dptr)[i].name, (*books_dptr)[i].author); } fclose(fp); }
- 해결됨홍정모의 따라하며 배우는 C언어
3분 15초 경에 제 생각이 맞는 건가요?
int arr[5] = { 100, 200, 300, 400, 500 }; int* ptr1, * ptr3; ptr1 = arr; ptr3 = ptr1 + 4;일 때배열의 이름은 배열의 첫 번째 공간의 주소이다. 라고 한다면ptr1은 arr[0]을 가리킨다.ptr1 = arrarr == &arr[0]이라서 ptr1 + 4는 &arr[0] + (arr[0]의 자료형인 int의 크기) * 4 이고 배열의 이름은 배열의 첫 번째 공간의 주소를 가리키는 포인터와 비슷한 무언가이다. 라고 한다면ptr1은 arr을 가리키고 arr은 arr[0]을 가리킨다.ptr1 = &arr&arr != &arr[0]라서 ptr1은 arr[0]을 직접 가리키는 게 아니라 arr을 직접 가리키는거고ptr1 + 4는 &arr + (arr의 자료형의 크기) * 4인데 arr은 포인터와 비슷한거지 포인터가 아니라주소도 없고 자료형도 없는데 여기서 뭔가 말이 모순되는 것 같고 계산 결과를 보면 후자는 절대로 아닌거 같은데배열의 이름은 배열의 첫 번째 공간의 주소를 가리키는 포인터와 비슷한 무언가이다.라는 표현은 맞는 표현 아닌가요?맞는 표현인데도 불구하고 포인터와 비슷한 무언가라고 생각하고ptr1 + 4를 하면 결과가 잘못되는 게 뭔가 아닌거 같아요. 제 생각의 어떤 부분이 뭐가 잘못된 거죠?
- 해결됨홍정모의 따라하며 배우는 C언어
5분 50초경 제가 생각하는 게 맞는 건가요?
int a = 1;int* a_ptr = &a;a_ptr은 a를 가리키고a_ptr + 1은 a + 1을 가리킨다.배열에서는 원소에서 다음 원소로 갈 때 원소의 자료형의 크기 만큼 이동하는 걸 생각하면a + 1은 a 다음의 변수를 가리키는 것이고, a에서 a의 자료형인 (int 자료형의 크기) * 1 만큼 이동하는 것이다.그렇게 (int 자료형의 크기) * 1 만큼 이동을 해야지 a 다음의 변수를 가리킬 수 있다. 이렇게 생각을 해봤는데 이게 맞는 걸까요?a 다음의 변수라는 표현은 뭔가 틀린 것 같은데 저도 잘은 모르겠습니다.
- 해결됨홍정모의 따라하며 배우는 C언어
13.7강 0:53 fputs 함수 질문이 있습니다.
fputs 함수의 함수 원형에서 첫 번째 인수가 char* 형태인데 char 형태의 ch를 인수로 입력해서 그런지 아래 오류가 발생하면서 실행이 안되는 것 같습니다.'function': 'const char *' differs in levels of indirection from 'int' 혹시 다른 설정을 해야 하는 걸까요..??
- 해결됨홍정모의 따라하며 배우는 C언어
14분 41초경 질문
int arr[2][3] = { {1, 2, 3}, {4, 5, 6} }; int* parr[2]; parr[0] = arr[0]; parr[1] = arr[1]; printf("%p\n", &parr[0]); printf("%p\n", parr[0]); printf("%p\n", arr); printf("%p\n", &arr[0]); printf("%p\n", arr[0]); printf("%p\n", &arr[0][0]);이 예제를 제가 설명해보면&parr[0]은 parr[0]이라는 포인터의 주소이다.parr[0]은 arr[0][0]을 가리키는 포인터이다.arr은 arr[0]을 가리킨다.&arr[0]에서 배열의 이름은 주소이기 때문에 &를 붙이던 안 붙이던 똑같다. 따라서 arr[0]과 같다.arr[0]은 arr[0][0]을 가리킨다. 따라서 &arr[0]도 arr[0][0]을 가리킨다.그래서 출력을 하면 arr과 &parr[0]을 제외한 나머지는 전부 &parr[0][0]을 출력해야 하는 것 같은데실행 결과를 보면 arr도 &arr[0][0]을 출력하고 있어요.제가 잘못 이해한 게 맞을텐데 뭐가 잘못된 건지 모르겠어요 도와주세요질문이 너무 많아서 죄송합니다 제가 질문 게시판을 어지럽히는 것 같네요 ㄷㄷ