월 19,800원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨홍정모의 따라하며 배우는 C언어
int* 만큼 이동한다는 말의 뜻이 궁금합니다.
안녕하세요, 이전 질문글의 답변에서 궁금한 점이 있어 질문드립니다. 링크는 https://www.inflearn.com/course/lecture?courseSlug=following-c&unitId=28273&tab=community&category=questionDetail&q=1142021 이고, 스샷으로 가져왔습니다. 밑줄 친 부분이 이해가 잘 가지 않는데요,arr 배열의 원소타입이 int 이므로 , arr + 1 은 arr[1]을 가리키는 포인터의 위치로 이동한다는 건 잘 알겠습니다. arr, 즉, arr[0]의 주소가 만약 100이면 104 로 이동하겠죠. int 크기가 4바이트니까요.그렇다면, parr + 1도 int* 크기만큼 이동해야 할 것 같은데요, int* 는 주소값을 저장하는 타입이므로 주소값의 크기인 4바이트(혹은 운영체제에 따라 8바이트) 만큼 이동해야 할 것같은데, 하기 첨부한 그림을 보면 parr[0] 시작 주소 부터 parr[1] 시작 주소까지 12바이트를 이동합니다. 직관적으로는 그럴것 같은데 헷갈려서 질문드립니다. 감사합니다.
- 해결됨홍정모의 따라하며 배우는 C언어
* (asterisk) 가 초기화문에서 사용될때, 할당문에서 사용될때 차이.
안녕하세요,초기화문에서 *가 사용될땐 주소가 저장되고,일반 명령문에서 변수앞에 *를 붙이면 앞의 경우와 다르게 redirection 연산자로서 사용되는데 그냥 암기해야 되나요? 간단한 예를 들면, int *a = 0x0077*a = 123;위 두 문장의 의미는 각각 int 포인터 변수 a 를 선언하며 0x0077 이라는 주소값을 a 에 저장. a가 가리키는 주소(0x0077)에 접근하여 123을 저장. 감사합니다.
- 해결됨홍정모의 따라하며 배우는 C언어
함수 선언부와 정의부가 다른 파일에 있어도 빌드가 되는 원리.
안녕하세요,강의에서main.c 파일 안에 #include "my_print_fucntions.h"를 통해 my_print_functions.h를 main파일에 인클루드해주면, 함수의 선언부만 main.c에 복붙이 됩니다. 선언부는 main.c안에 놓이는거겠죠.그런데 이 때, #include "my_print_fucntions.c" , 함수의 바디가 정의되어있는 my_print_fucntions.c 파일을 main.c 안에서 인클루드해주지 않아도 되는 이유는, 링커가 알아서 함수를 찾아 연결해주기 때문이고, 그렇게 되는 이유는 헤더파일의 함수 선언부에서 extern 키워드가 생략되어있어서 그렇다고 봐도 될까요?( (extern) void print_hello(); 이렇게요.) 감사합니다.
- 해결됨홍정모의 따라하며 배우는 C언어
7분 28초경 질문
저번에 아무 생각 없이 지나쳤던 부분을복습을 하면서 다시 보니 뭔가 이상해서 질문을 드립니다.교수님이 arr2d를 인디렉션을 하면 arr2d[0]이 나온다고 하셨는데저 생각으로는 &arr2d[0][[0]이 나오거든요아마 제가 틀린걸거라고 생각은 하는데 교수님 말씀이 잘 이해가 안되네요arr2d는 &arr2d[0]이고(arr2d[0]을 가리키고)arr2d[0]은 &arr2d[0][0]이니(arr2d[0][0]을 가리키니)arr2d를 인디렉션하면 &arr2d[0][0]이 나오는 게 제 생각에서는 맞는건데...제가 지금까지 공부하면서 만든 복습노트를 봐도 제 생각에서는 &arr2d[0][0]이 맞는데역시 제가 틀린거겠죠?아니면 교수님 설명을 제가 다른 뜻으로 이해를 한 것 인가요?
- 미해결홍정모의 따라하며 배우는 C언어
저번에 VS code 실행이 안된다고 글 남긴 수강생입니다......
교수님께서 말씀하신 깃허브 내용대로 c/c++ runner도 깔고 json 코드도 일부 수정했는데 여전히 실행이 안됩니다 뭐가 문제일까요.....아래에 launch.json 코드도 남기겠습니다. 그리고 말씀하신 xcode가 xcode-select 말씀하시는 거면 깔려있습니다. 제발 뭐가 문제인지 알고 싶네요 ㅜㅜ 초보라서 아직 개발 환경 설정 이런 데는 정말 다루기가 어렵습니다..... <launch.json> "version": "0.2.0", "configurations": [ { "type": "lldb", "request": "launch", "name": "Debug", "program": "${workspaceFolder}/<executable file>", "args": ["-std=c++17"], "cwd": "${workspaceFolder}" }, { "name": "C/C++ Runner: Debug Session", "type": "lldb", "request": "launch", "args": ["-std=c++17"], "cwd": "/Users/brian/Downloads/Visual Studio Code 2.app/Contents/Practice", "program": "/Users/brian/Downloads/Visual Studio Code 2.app/Contents/Practice/build/Debug/outDebug" <c_cpp_properties>"configurations": [ { "name": "macos-clang-x64", "includePath": [ "${workspaceFolder}/**" ], "compilerPath": "/usr/bin/clang", "cStandard": "c17", "cppStandard": "c++17", "intelliSenseMode": "macos-clang-x64", "compilerArgs": [ "" ] } ], "version": 4}
- 해결됨홍정모의 따라하며 배우는 C언어
printf(".20f",d) 출력 범위 질문
이렇게 커맨드를 쳤는데,이렇게 나왔습니다.그런데 제 출력값과 달리, 교수님은 3.141592....600 으로 끝이 반올림이 되었고, 그 이유로 double로 표현할 수 있는 자릿수의 한계때문에 그렇다고 말씀주셨습니다.근데 저는 왜 반올림이 안되고 끝까지 나온걸까요?release, x86 에서 실행했습니다!
- 미해결홍정모의 따라하며 배우는 C언어
vscode 실행이 안됩니다......정말 힘드네요
실행하려고 했더니 위와 같은 오류가 발생했습니다..... 제 나름대로 구글링도 해보고 깔려있는 json 파일에 들어가서 컴파일 경로도 수정해보고 configuration도 바꿨는데도 계속 오류가 나더군요....정말 너무 안 돼서 답답합니다 혹시 이 문제 어떻게 해결해야 할지 여쭤봐도 될까요? 도움 주신다면 정말 감사하겠습니다
- 미해결홍정모의 따라하며 배우는 C언어
1차 배열과 2차 배열에서 *ptr의 차이
1차 배열에서 *ptr은 해당 첫번째 메모리의 값이엿는데2차 배열에서 *ptr은 메모리값이 아니라 첫번째 메모리의 주손가요??
- 해결됨홍정모의 따라하며 배우는 C언어
배열로 예제를 풀면서 궁금했던 점.
#include <stdio.h>#include <stdbool.h>int library[100], number, bignumber, smallnumber, samenumber[100]; int i, sum, trial, same, last = 0;int main(){printf("Type your number : "); for(;scanf("%d", &number) != 0; i++) { library[i] = number; sum += number; } // i 는 반복한 횟수에서 한 번 더 더해지고 끝난다.printf("\n%d\n", sum);for(int a = 0;a != i + 1;a++) { for (int b = 0; b != i + 1;b++) { if(library[a] < library[b]) trial++; if (library[a] == library[b] && a != b) { same++; samenumber[a] = library[a]; } } if (trial == 0) bignumber = library[a]; if(trial == i - 1) smallnumber = library[a]; if(same > 0) { for (int c = 0;c != i + 1; c++) { if (samenumber[a] < library[c]) last++; } if (last == i - same - 1) smallnumber = samenumber[a]; } trial = 0; }printf("Biggest number : %d, Smallest number : %d, Mean : %f", bignumber, smallnumber, (float)sum / (float)i);return 0;} 이렇게 코드를 작성하여 예제 구현을 마쳤습니다. 배열을 사용해 수를 지정하고, 일일히 비교하는 제 방식을 쓰다가, 강의를 보니 맥이 빠지더군요....ㅋㅋ 제 질문은 library 주소에 미리 100개의 공간을 할당해두었는데, 만약 사용자가 100번 이상 수를 입력했을 때에도 프로그램이 원활하게 돌아가기 위한 대책입니다. 제가 입력한 횟수만큼만 library에 할당된 공간을 늘릴 수 있을까요?
- 미해결홍정모의 따라하며 배우는 C언어
scanf와 버퍼 질문
scanf 함수는 입력 버퍼에서 개행 문자는 가져오지 않고 내버려두는 것이라고 들었습니다.제가 궁금한 점은 만약 scanf 함수를 연달아 쓴다면 다음 입력 버퍼의 처음에 개행 문자가 있어서 오류를 일으키지 않느냐는 것입니다.예를 들어 scanf("%d", &i1); scanf("%d", &i2) 라고 작성했을 때 첫번째 scanf에서 10을 입력하고 엔터를 쳤다고 가정하면 입력 버퍼에는 10과 \n이 들어가는데, scanf 함수는 \n은 읽어들이지 않아서 입력 버퍼에 그대로 남게 되는 것이 아닌가요? 제 생각엔 버퍼 지우기 while을 두 개의 scanf 함수 사이에 넣어야 버퍼를 비울 수 있다고 생각했는데 해보면 정상작동이 되는 이유가 궁금해요..
- 미해결홍정모의 따라하며 배우는 C언어
이렇게 간단한 것도 구현 못하는 거면 심각한가요?
이중 for문 자체는 이해를 하고 있는데 아예 떠올리질 못했습니다...이런 경우엔 뭘 해야 하나요? 복습한다고 해서 의미가 있을까요?
- 해결됨홍정모의 따라하며 배우는 C언어
3분 40초경 질문
3분 40초경의 교수님 설명을 듣고void swap(char** xp, char** yp){char* temp = *xp;xp = yp;*yp = temp;}void selectionSort(char* arr[], int n){int i, j, min_idx;for (i = 0; i < n - 1; i++) // Note n - 1{min_idx = i;for (j = i + 1; j < n; j++) // Note i + 1{if (strcmp(arr[min_idx], arr[j]) == 1) //if (arr[min_idx] > arr[j])min_idx = j;}swap(&arr[i], &arr[min_idx]);}} 를 void swap(char* xp, char* yp){char* temp = xp;xp = yp;yp = temp;}void selectionSort(char* arr[], int n){int i, j, min_idx;for (i = 0; i < n - 1; i++) // Note n - 1{min_idx = i;for (j = i + 1; j < n; j++) // Note i + 1{if (strcmp(arr[min_idx], arr[j]) == 1) //if (arr[min_idx] > arr[j])min_idx = j;}swap(arr[i], arr[min_idx]);}}예제를 이렇게 바꿔봤습니다.포인터 변수의 주소를 넘겨주는 대신에 포인터 자체를 넘겨주고swap 함수 안의 xp나 yp에 *를 때주면 첫 번째 예제와 두 번째 예제가 같아지는 것 아닌가요?뭐가 잘못된건지 이해가 가질 않습니다. 추가로 swap 함수에 대해서 설명을 해봤는데 제 설명이 맞는건지 알려주시면 감사하겠습니다. swap의 매개변수를 char**로 적은 이유는 넘겨줄 게 포인터 변수의 주소라 char에 **를 붙여줬기 때문이다.그리고 swap 함수 안에서 xp나 yp에 *를 붙인 이유는 매개변수로 넘겨준 건arr[i], arr[min_idx]라는 포인터의 주소이고 스왑 해줘야 할 건 그 포인터의 메모리 공간에 있는 주소값이기 때문이다.
- 해결됨홍정모의 따라하며 배우는 C언어
13분경 질문
https://www.inflearn.com/questions/445486이 질문의 답변에서strncpy는 복사 하려는 공간이 복사 대상보다 클 경우 null value로 채워주는 것으로 알고 있습니다.라고 말씀을 해주시는데그러면 char dest[100] = ""; // make sure memory is enoughchar source[] = "Start programming!";strcpy(dest, source);strncpy(dest, source, 5); 이걸 실행 했을 때 Start만 출력이 되어야 하는 거 아닌가요?근데 교수님은 Start가 복사 될 때 복사 될 문자열에 NULL 캐릭터가 없어서위의 예제를 실행하면 Start programming!가 전부 출력 된다고 말씀하셨고 실제로 그렇게 됐잖아요교수님 말씀이 맞는건지 아니면 제가 답변자님 답변을 잘못 이해한 것인지 잘 모르겠네요source가 들어갈 dest에 이미 데이터가 들어가 있어서 나머지 공간을 NULL 캐릭터로 채워주지 않은거라고 해석해도 될까요? 그리고 Start programming!이 전부 출력되는 이유를 제가 강의를 듣고 나름대로 설명해 봤는데 이게 맞는지 모르곘네요.위의 예제를 실행시키면 "Start”만 출력을 할 것 같지만"Start programming!" 전부를 출력하는데 그 이유는strncpy() 함수에서 원본을 복사해서 넣을 때 복사본의 맨 마지막에NULL 캐릭터를 추가해주지 않고 문자열을 복사해서 넣어줄 공간만 신경 쓰지 그 외의 공간은 신경 쓰지 않기 때문이다.(dest에서 Start가 들어갈 공간만 신경 쓰지 나머지 공간은 신경 쓰지 않는다는 뜻)라고 설명을 해봤어요
- 해결됨홍정모의 따라하며 배우는 C언어
2분경 질문
char str[] = { 'H', 'I', '!' };여기서는 str이라는 문자열에 NULL 캐릭터가 없는데char str2[15] = { 'H', 'I', '!' };여기서는 str2라는 문자열에 널캐릭터가 있더라구요차이는 빈공간이 있느냐 없느냐 차이인 것 같은데str에는 빈공간이 없어 NULL 캐릭터를 넣어줄 공간이 없어서puts() 함수로 출력하면 'H', 'I', '!' 이외의 문자들이 출력이되고str2에는 빈공간이 있어 그 자리를 NULL 캐릭터로 채워줘서puts() 함수로 출력을 하면 'H', 'I', '!' 까지만 출력을 해주는 게 맞나요?뭔가 더 알맞는 표현으로 설명이 가능할 거 같은데 저는 잘 안되네요
- 미해결홍정모의 따라하며 배우는 C언어
입력 버퍼에 대한 개념이 없는데 4분 30초경 설명
입력 버퍼에 대한 개념이 없는데 4분 30초경 설명은 이해할 수 없는거 아닌가요..? 제가 앞 강의 중에서 놓친 부분이 있는지궁금하네요...질의응답 글 보고 입력버퍼에서 getchar로 값을 하나씩 꺼내올 때 입력버퍼에서도 하나씩 사라진다는걸 알았는데 제가 이해한 내용이 맞나요??
- 미해결홍정모의 따라하며 배우는 C언어
오류
수업에 나온 것과 똑같이 코딩을 했는데 오류가 다음과 같이 뜨는데 해결이 되질 않습니다.
- 미해결홍정모의 따라하며 배우는 C언어
9분 45초 경 질문
처음에 변수로 잡은 것이 double이면 scanf에 %d를 입력하면 왜 안 되는 건가요? 왜 %d가 아니라 %lf로 입력을 했는지 잘 이해가 가지 않습니다. 혼자서 %d 넣고 해보니까 에러가 떠요.
- 해결됨홍정모의 따라하며 배우는 C언어
저도 6분 30초경 &end가 이해가 잘 안되요
함수가 작동하는 구조가 이게 맞는지 궁금합니다.매개변수로 이중 포인터를 집어넣으면 이중 포인터가 가리키는 포인터의 메모리 공간에변환할 수 없는 문자의 공간의 주소를 대입해주는 게 맞나요?이게 맞다면 굳이 그냥 포인터에 주소를 대입해 주는 게 아니라이중 포인터를 매개변수로 이중 포인터가 가리키는 포인터에 주소를 대입해주는 이유가 뭔가요?
- 해결됨홍정모의 따라하며 배우는 C언어
2분 13초경 if (new_line)이 있어야 하는 이유
new_line = strchr(line, '\n'); 에서 line 문자열에서 '\n'을 찾으면new_line에 포인터를 대입하고 못 찾으면 NULL 캐릭터를 대입하는데포인터를 대입하고 *new_line = '\0';을 실행시키면 의도대로 되는 것이고널 캐릭터를 대입하고 *new_line '\0'을 실행시켜도 문제는 생기지 않을거 같아서if (new_line) 이라는 문장이 없어도 괜찮을 거 같은데 왜 있는 건가요?널 캐릭터를 대입하고 *new_line '\0'을 실행시키면 문제가 되서 그런건가요?아니면 다른 이유가 있는 건가요?
- 해결됨홍정모의 따라하며 배우는 C언어
strstr 함수 구현 질문
함수들을 직접 구현해보는 게 좋다고 하셔서 sprintf() 함수를 제외하곤 전부 구현하려고 노력해봤는데strstr함수는 어떻게 해야 할지 모르겠어서 구글링을 해봤는데https://blog.naver.com/tipsware/221371715770이런 글을 발견했어요코드를 따라치다 이해가 안되는 부분이 생겼는데while (*p_find_pos != 0 && *p_pos != 0 && *p_pos == *p_find_pos)에서 *p_find_pos != 0와 *p_pos != 0이 둘 다 존재하는 이유가 궁금합니다.strstr함수가 어떤 문자열에 특정 문자열이 포함되어있는지 확인하는 함수인데만약 어떤 문자열과 특정 문자열이 완전히 똑같다면 while의 조건문에서*p_pos == *p_find_pos 만 있으면 while문이 멈추지 않고 무한히 돌게 되니널 캐릭터를 만나면 멈출 수 있게 *p_find_pos != 0나 *p_pos != 0 둘 중에 하나는 있어야 한다는 건 알겠는데왜 둘 다 조건문에 있어야 하는지 잘 모르겠습니다.강의 내용이 아니라 질문하기가 좀 그랬지만 이런 질문글을 올릴만한 곳을 찾지 못해 여기에 올립니다. 답변 항상 감사합니다.