월 19,800원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨홍정모의 따라하며 배우는 C언어
3분 48초 부근 질문 있습니다.
16.6에서는 다른 파일에 있는 함수를 실행해서 주소를 비교할 때 함수는 선언할 때 default 값이 extern 이기 때문에 앞에 static이 없는 상태로 main.c에서 my_function.c에 있는 함수 print_address를 사용했는데요 이번 강의에서는 DifferentFile.h에 있는 different_func_in_different_file()를 사용할 때 앞에 static을 붙이시고 그것을 main.c에서 #include DifferentFile.h를 한 다음에 different_func_in_different_file()를 사용하고 있습니다. 이때 #include가 지금까지는 거의 복사, 붙여넣기 수준의 예제로 공부하고 있기 때문에 main.c에서 DifferentFile.h안에 사용된 static으로 정의된 함수를 #include DifferentFile.h로 가져온다면 결국은 main.c에서 static인 different_func_in_different_file()를 사용하는 것인데 어떻게 파일 이름이 다르게 나오는지 잘 이해가 가지 않습니다. static인 함수는 BSS에 저장이 되지만 다른 파일에서 불러올 때 그 파일에서만 visible하기 때문에 같은 이름으로 접근이 가능한 메모리가 BSS 메모리 공간에 하나 더 생기는 것으로 배웠고 16.6에서 주소가 다르게 나오는 것으로 확인할 수 있었는데요. 그렇다면 현재 Different_func_in_different_file()는 static으로 정의가 되어있기 때문에 DifferentFile.h에 있는 Different_func_in_different_file()에 접근하는 것이 아니라 main.c에서 #include에 의해서 복사, 붙여넣기 된 static인 different_func_in_different_file()에 접근을 하는 것이므로 DifferentFile.h 파일의 위치를 문자열로 나타내는 것이 아니라 main.c 파일의 위치를 문자열로 나타내야되는 것이 아닌가요? 제가 이해한 바로는 #include의 특성상 헤더파일의 함수가 static이냐 extern이냐에 따라서 함수의 결과값이 다르게 나올 것으로 예상이 되는데 어떤 이유로 static과 extern의 __FILE__의 값이 같게 나오는지 궁금합니다.
- 해결됨홍정모의 따라하며 배우는 C언어
텍스트 파일 접근에 관한 질문입니다.
안녕하세요. 제가 텍스트 파일에 여러 실험을 해보다 의문점이 생겨 질문 드립니다. 6 Sector 7 4.6 전 해당 내용을 가진 텍스트 파일의 내용을 수정하기 위해서 해당 코드를 작성했습니다. FILE* file = fopen(filename, "r+"); int num; fscanf(file, "%d%*c", &num); printf("%d\n", num); fseek(file, 0, SEEK_CUR); fwrite("JohnWick", 9, 1, file); fclose(file); 기존 내용의 삭제 없이 수정하기 위해 r+ 옵션을 사용하고 한번씩 파일에서 입, 출력을 실행했습니다. 해당 코드는 잘 작동했으나 fseek() 함수를 사용하지 않을시 에러가 발생했습니다. 제가 사용한 fseek(file, 0, SEEK_CUR); 은 file 포인터 위치를 현재 위치에 그대로 두는, 사실상 의미가 없는 과정인데 어째서 이런 결과가 나오는 것인지 알고 싶습니다. 답변 부탁드립니다.
- 미해결홍정모의 따라하며 배우는 C언어
void swap(char** x, char** y) 함수의 내부에서
void swap(char** x, char** y) { char* temp = *x; *x = *y; *y = temp; } 이 함수에서 질문이 있습니다. 문자열 배열을 매개변수로 전달하기 위해서 이중포인터를 썻다는 것은 이해가 됐고, 임시 변수 temp에 문자열을 담아야 하니 char* temp 로 선언해준 것도 이해가 됐는데요, 왜 void swap() 함수 내부에서는, 매개변수로 이중포인터를 받아줬음에도 *x, *y로 사용하나요?(**x,**y가 아니라) 그리고 마지막 *y = temp; 문장도 temp선언을 포인터로 해줬는데 *y = *temp가 아닌 이유를 모르겠어요
- 해결됨홍정모의 따라하며 배우는 C언어
exit()함수
안녕하세요. exit()함수가 <stdlib.h>에 선언되어 있다고 하셨는데 <stdio.h>만 있어도 exit()함수가 작동이 됩니다. 비주얼 스튜디오 2022 Preview 사용 중인데 IDE 버전의 차이 때문인가요?
- 해결됨홍정모의 따라하며 배우는 C언어
16:00 부분 질문있습니다.
제가 기억하기로 static keyword를 하면변수가 BSS에 저장이 된다고 알고 있는데요.12강 강의를 전부 다 복습했는데도 불구하고 다른 파일에서 같은 이름을 가진 변수에 static keyword를 사용했을 때 마치 automatic variable처럼 다른 주소를 갖는 다는 내용의 설명은 찾질 못했습니다.static일 경우는 그 파일 혹은 블록 내에서만 사용되는 지역변수이지만 automatic variable과는 다르게 프로그램의 시작부터 끝까지 남는다고 알고 있습니다.그래서 16:00부터의 강의 내용이 잘 와닿지가 않는데요. 제가 그나마 이해한 부분은 만약 my_functions.h 에서 static이 아닌 extern으로 si를 선언했다면 #include "my_functions.h"를 했을 때 si의 선언이 중복이 돼서 불가능하지만static keyword로 선언을 했다면 해당 파일 내에서만 visible한 지역변수로 취급이 되기 때문에 다른 파일에서 또 선언이 될 시 프로그램 전체로 봤을 때는 BSS에 같은 변수 이름으로 접근이 가능한 메모리 공간이 하나 더 생기지만 각 파일 입장에서는 해당 변수 이름으로 접근을 할 때 컴파일러 입장이나 링커 입장에서 컴파일 오류나 링킹 오류를 발생시키지 않는다고 이해했습니다.제가 생각한 내용이 맞거나 혹은 틀린 부분이나 추가적으로 알아야 하는 내용이 있다면 말씀해주시면 감사합니다.
- 해결됨홍정모의 따라하며 배우는 C언어
구조체 포인터의 동적할당 관련 질문입니다.
안녕하세요. 제가 이 강좌를 완강하고 여러 문제들을 풀어보던중 풀리지 않는 문제가 이번 강의 주제와 연관이 있는것같아 질문 드립니다. include <stdio.h> #include <stdlib.h> typedef struct _adress { int th; char name[10]; char adress[10]; char phone[15]; } adress; void Input(adress*, int); int main() { int man_num; puts("Make adress Book."); printf("Input man's number : "); while (scanf("%d", &man_num) != 1) { printf("Worng input, Try again : "); while (getchar() != '\n'); } puts("=============================="); while (getchar() != '\n'); adress* adress_book = (adress*)malloc(sizeof(adress) * man_num); if (adress_book == NULL) return -1; Input(adress_book, man_num); for (int i = 0; i < man_num; ++i) { printf("Th : %d\nName : %s\nAdress : %s\nPhone Num : %s\n", adress_book[i].th, adress_book[i].name, adress_book[i].adress, adress_book[i].phone); // 해당 printf에서 C6385 경고 발생. 여러 수정중 C6386 경고도 자주 발생. // Input 함수에서 입력한 값이 재대로 출력되지 않음. puts("=============================="); } free(adress_book); return 0; } void Input(adress* input, int num) { for (int i = 0; i < num; ++i) { input[num].th = i + 1; printf("Th : %d\n", input[num].th); printf("Name : "); scanf("%s", &input[num].name); printf("Adress : "); scanf("%s", &input[num].adress); printf("Phone Num : "); scanf("%s", &input[num].phone); puts("=============================="); } } 해당 문제는 구조체 배열을 사용하여 번호, 이름, 거주도시, 핸드폰 번호를 원하는 만큼 입력하고 출력하는 프로그램입니다. 본래 풀이는 일반 구조체 배열을 선언하여 입력하는 것이지만, 전 이 강좌 "12.15 동적 할당 메모리를 배열처럼 사용하기"에서 배운것들을 응용하면 메모리를 정확히 필요한 만큼만 할당할수 있을것 같았습니다. 하지만 예상과 달리 여러 문제가 생겨 재대로 작동하지 못했습니다(주로 발생한 문제들을 주석으로 적었습니다) 여러번 고쳐보고 디버그 해봐도 답을 찾지 못했습니다. 애초에 동적 할당한 구조체 포인터 변수를 배열처럼 사용하는 것은 불가능한 건가요? 답변 부탁드립니다. 감사합니다.
- 미해결홍정모의 따라하며 배우는 C언어
강의 마지막에 나오는 함수 char* custom_string_input(char* st, int n)가 잘 이해되지 않습니다.
함수 char* custom_string_input(char* st, int n)에서 중간에 있는 if (ret_ptr)가 무슨 의미인지 잘 모르겠습니다. 언제 성립하고 언제 성립하지 않는지 모르겠습니다.
- 미해결홍정모의 따라하며 배우는 C언어
매개변수로 포인터를 받으려면, 인자로 넘겨줄때 주소를 넘겨줘야하는 것 아닌가요?
안녕하세요, 예제를 따라해보다가 궁금한 점이 생겼습니다. int sum(int *arr, int n) { int result = 0, i; for (i = 0; i < n; i++) { result += arr[i]; } return result; } int main() { int arr[5] = { 1,2,3,4,5 }; printf("%d", sum(&arr, 5)); return 0; } 코드는 위에 나온대로 만들어봤습니다. 다른 질문의 답변을 보니 프로그래머의 취향에 따라서 배열과 포인터를 혼용해서 사용하신다는 걸 보았습니다. 그래서 sum함수의 매개변수를 int arr[]이 아니라 *arr로 받아보았습니다. 매개변수를 포인터로 받았으니, 인자로 주소값을 넘겨줘야 한다고 생각해서 main의 출력문에서 sum(&arr) 이렇게 넣어줬더니 실행은 되지만 warning이 나오네요. warning C4047: 'function': 'int *' differs in levels of indirection from 'int (*)[5]' warning C4024: 'sum': different types for formal and actual parameter 1 질문1. 인자를 그냥 arr로 넘겨주면 warning이 나오지 않는 것은, 배열 자체가 포인터로 쓰이기 때문에 그냥 sum(arr) 이렇게만 해도 주소를 넘겨주는 것이 되기때문인가요? 질문2. 포인터로 매개변수를 받으니 인자로 주소값(&arr)을 준건데 왜 warning이 나오나요? 질문1의 이유 때문에, 이미 주소값을 넘겨주는 형태인 arr에 &연산자를 붙였기 때문에 그런 것인가요?
- 미해결홍정모의 따라하며 배우는 C언어
교수님! 예제와 똑 같이 작성했는데, A 3 2 입력하고 엔터를 눌러도 행렬이 나오지 않습니다. 왜 이럴까요
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> void display(char cr, int lines, int width); int main() { char c; int rows, cols; while (1) { scanf("%c %d %d", &c, &rows, &cols); display(c, rows, cols); if (c == '\n') break; } return 0; } void display(char cr, int lines, int width) { } 교수님 안녕하세요. 짙은 글씨 scanf("%c %d %d", &c, &rows, &cols);에 밑줄이 생깁니다. 그리고 창에 A 3 2 이런식으로 입력하고 엔터를 눌러도 행렬이 나오지 않습니다. 왜 이럴까요? 왕 초보입니다. 자세한 설명 부탁드립니다.ㅠㅠ
- 미해결홍정모의 따라하며 배우는 C언어
7:05 변수의 주소
안녕하세요 강의 잘 보고있습니다. 7:05 부터 말씀하신 부분에 대해 질문이 있습니다. `포인터 앞에도 앰퍼센드를 붙여서 주소를 출력할 수 있지만, 그것은 포인터 변수 자체의 주소를 의미하는 것이고, 포인터가 가리키고 있는 주소가 아니다` 라고 말씀하신 부분입니다. 그래서 임의의 변수 a와 a를 가리키는 포인터변수를 만들어서 &a와 &*ptr의 주소가 같은지 출력을 해봤는데 결과가 1이 나왔습니다. 제가 생각하기에도 당연한 것이, &a는 변수 a의 주소이고 *a_ptr는 a를 가리키니, 그 주소 역시 &a와 결국 같은 말 아닌가? 하는 생각입니다. 강의 7:05부분에서 말씀하신 내용을 제가 잘못 이해한 것인가 궁금하며 이렇게 질문올립니다. 감사합니다. int a = 10; int* a_ptr = &a; printf("%d", &a,==&*a_ptr); + 뒤늦게 생각이 났는데, 혹시 말씀하신 포인터변수 자체의 주소라는 것은 &a_ptr 라고 생각하면 맞는건가요?
- 미해결홍정모의 따라하며 배우는 C언어
for문을 나누는 것이 더 효율적인 이유
교수님께서 size가 어마어마하게 커진다면 for문을 하나로 합치는 것 보다 for문을 쪼개는 것이 오히려 효율적일 수 있다는 말씀을 해주셨는데요. 그 이유가 너무 궁금해서 질문드립니다. 코드의 품질 측면이 아닌 하드웨어 측면에서 차이가 나는 걸까요? 어떤 공부를 해야 그 답을 찾을 수 있을까요.
- 미해결홍정모의 따라하며 배우는 C언어
undefined reference to `WinMain@16' 에러
gcc 컴파일러를 사용하여 c를 컴파일할때는 이상없으나 교수님이 c++도 해보자하셨을때 똑같이 하니 저런 에러가 나옵니다. 에러해결방법을 못찾겠어서 질문드립니다. (밑에 사진은 코드를 아무것도 작성하지 않았지만 교수님과 동일하게 hello world 작성하여도 동일한 오류가 나옵니다.)
- 미해결홍정모의 따라하며 배우는 C언어
함수의 매개변수로 배열이 들어갈 때 []안에 있는 값이 어떻게 되는지 궁금합니다.
배열이 함수의 매개변수로 들어갈 때는 포인터로 바뀌어서 주소만 들어가게 되는데 이번 강의에서는 ROWS랑 COLS가 제대로 들어가는 것으로 보입니다. sum2d_1의 경우 매개변수로 data만 넣어줬음에도 제대로 동작하고 있습니다. 이번에는 어떻게 []안의 값이 들어간건지 궁금합니다.
- 미해결홍정모의 따라하며 배우는 C언어
배열이 매개 변수로 사용 될 때 포인터로 바뀔 때 내부 상황이 궁금합니다.
포인터에 배열이름으로 배열의 첫 주소를 저장할 때와 같은 배열이름이 포인터처럼 작동할 때는 메모리를 사용하는 게 아니라 단순히 컴파일러가 변환시켜주는 것으로 알고 있습니다. 그런데 매개변수로 사용할 때는 그 크기가 포인터의 크기로 나오면 메모리에 실제로 포인터 변수가 만들어진 건가요? 그게 아니라면 어떻게 sizeof연산자를 사용했을 때 포인터의 크기가 나오는지 잘 모르겠습니다.
- 미해결홍정모의 따라하며 배우는 C언어
출력 오류가 발생합니다.
강의에서 말씀해 주신 pointer를 이용해서 예제를 작성했는데 첫 줄만 출력되고 둘째줄 부터는 출력이 되지 않습니다. print_books 함수에서 books[1]->name, books[2]->name 등이 접근이 되지 않는데 코드에 무슨 문제가 있는 걸까요? 확인 부탁드립니다. 감사합니다. #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> // strrlen(), strcmp() #include <string.h> // malloc(), free() #define SLEN 100 struct book { char name[SLEN]; char author[SLEN]; }; void print_books(const struct book *books[], int n); int main(void) { struct book* my_books = (struct book*)malloc(sizeof(struct book) * 3); my_books[0] = (struct book){ "a","b" }; my_books[1] = (struct book){ "baa","f" }; my_books[2] = (struct book){ "g","a" }; print_books(&my_books, 3); free(my_books); 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); }
- 미해결홍정모의 따라하며 배우는 C언어
print_binary_loop
void print_binary_loop(unsigned long n) { int i, j, ary_num = 0; int bin[] = {0}; for (i = 0; n > 0; n = n / 2, i++) { if ((n / 2) != 0) bin[i] = n % 2; else bin[i] = 1; ary_num += 1; } for (j = ary_num - 1; j >= 0; j--) printf("%d", bin[j]); printf("\n"); } 아직 c언어 배열은 안배웠지만 파이썬 배열과 다를게 없다 생각해서 기본적인 문법만 구글링하면서 써봤습니다. 제가 직접 루프를 짜봤는데 교수님꺼보단 많이 복잡하지만,,, 실행시킬 때마다 이런 오류가 뜨고 무시를 누르면 잘 실행이 되기는 합니다. 이 오류를 고치고 싶은데 방법을 모르겠습니다 ㅠ
- 미해결홍정모의 따라하며 배우는 C언어
word count를 공백을 제외하는 문제라면?
#include <stdio.h> #include <ctype.h> int main() { char ch; int n_chars = 0; while((ch=getchar())!= '\n'){ if(isspace(ch)){ n_chars++; } } printf("%d",n_chars); return 0; } 단어 개수를 공백도 단어라고 본다면 저렇게 쉽게 풀리는데, 만약 문제가 공백은 단어로 취급하지 않는다면 getchar()로 입력받아서는 풀이가 불가능한가요? 입력이 문장의 첫 번쨰 혹은 마지막이 공백이라면 예상한 개수보다 +1이 더 나오게되는 문제가 있습니다. 이런 문제의 경우 입력의 첫 혹은 마지막 문자가 공백일 경우를 따로 세어주는 해법을 생각해봤는데, 그러기 위해서는 일단 입력자체를 문자열로 받은다음에, 인덱스로 접근해서 각각 분기해줘야 하는것 아닌가, 그렇다면 getchar()로는 풀 수 없는 것 아닌가? 이런 생각이 드네요 getchar()를 활용한 소스가 검색으로는 도저히 안나와서... 질문올려봅니다. 요약: 공백을 제외한 단어만을 카운트해준다면 getchar()로 입력받아서는 안되고, 반드시 문자열로 입력을 받는 수밖에 없다?입니다 감사합니다..
- 미해결홍정모의 따라하며 배우는 C언어
재귀함수 디버깅
int main() { my_func(1); return 0; } void my_func(int n) { printf("Level %d, address of variable n = %d\n", n, (int) & n); if (n < 4) // stop condition my_func(n + 1); printf("Level %d, address of variable n = %d\n", n, (int)&n); } if문 아래에 있는 printf에 디버깅을 찍어봤는데 printf가 한번 출력하고 끝나지 않고 왜 다시 printf로 올라가서 반복하나요? 스택에 있는거 다 뺄 때까지 되감기 하는건가요?
- 미해결홍정모의 따라하며 배우는 C언어
출력값이 이상합니다
아래의 source code에서 txt 내용과 출력 결과가 다릅니다 어떤 이유인지 알 수 있을까요? [input .txt 내용] I love asd I love qwe hello world! [출력 결과] 00000000000000000000000000000000 I love asd I love qwe hello wowo [source code] #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() { FILE* fp; int ch; /* setvbuf() */ fp = fopen("input.txt", "r"); char buffer[32] = { '\0', }; setvbuf(fp, buffer, _IOFBF, sizeof(buffer)); for (int i = 0; i < sizeof(buffer); ++i) printf("%hhd", buffer[i]); printf("\n"); ch = fgetc(fp); for (int i = 0; i < sizeof(buffer); ++i) printf("%c", buffer[i]); printf("\n"); fclose(fp); return 0; }
- 미해결홍정모의 따라하며 배우는 C언어
4.4 strlen()함수 강의 마지막 부분 출력 값이 안나옵니다
-제가 적은 코드 내용- #include <stdio.h> #include <string.h> int main() { char *str5 = (char*)malloc(sizeof(char) * 100); str5[0] = 'H'; str5[1] = 'e'; str5[2] = ';'; str5[3] = 'l'; str5[4] = 'o'; str5[5] = '\0'; printf("%zu %zu\n", sizeof(str5), strlen(str5)); return 0; } 강의에서는 4 5 출력값이 나오게 되는데 제가 출력하게 되면 exited with code -1073741819. 라고 나옵니다 build도 해봤는데 오류도 안나고 뭘 잘못한건지 궁금합니다