월 19,800원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨홍정모의 따라하며 배우는 C언어
my_strcat 구현에 대해서 질문이 있습니다.
void my_strcat(char* str1, char* str2) { if (sizeof(str1) - strlen(str1) > strlen(str2)) { for (int i = 0; i < strlen(str2); ++i) *(str1 + strlen(str1) + i) = *(str2 + i); } } 이렇게 하고 puts()를 해보면 첫 글자만 덧붙여지길래 디버깅을 해보니 계속 str[13]에 null 이 찍혀있는 것을 확인했습니다. 그래서 도대체 틀린게 무엇인지 오랜시간 고민을 하다가 void my_strcat(char* str1, char* str2) { int number = strlen(str1); if (sizeof(str1) - number > strlen(str2)) { for (int i = 0; i < strlen(str2); ++i) *(str1 + number + i) = *(str2 + i); } } 이렇게 strlen(str1)을 number로 바꿔보니 제대로 작동하는 것을 확인할 수 있었습니다. 그 이유가 무엇인지 정말 궁금합니다.
- 미해결홍정모의 따라하며 배우는 C언어
1.xxx에서 1은 항상 있다고 말씀하신 게 무슨 의미인지 잘 모르겠습니다.
significand에 항상 1이 있다는 말씀이신 건가요?
- 미해결홍정모의 따라하며 배우는 C언어
런타임 에러의 경고표시에 대한 질문입니다.
안녕하세요 교수님. 컴파일러의 런타임에러 경고 작동에 관한 질문을 올립니다. 이미지로 저장한 화면을 보시면 전 인위적으로 런타임 에러를 발생시키기 위해 할당되지 않은 주소에 값을 넣었습니다. 그런데 교수님의 예제와는 다르게 녹색 물결표시로 경고가 뜨지않고 실행했을때 에러메시지가 뜨기는 하지만 실행 자체는 되었습니다. Error List에도 아무런 경고나 에러가 없어서 당황스럽습니다. 정작 IntelliSense의 오류 물결선은 사용이라 설정되어 문법 오류 물결선(빨간색)은 잘 나옵니다. 전 현재 visual studio 2019 최신버전으로 'C++를 사용한 데스크톱 개발' 만을 다운로드 받아 사용하고있습니다. 교수님과 같은 경고 표시줄을 보려면 어떻게 해야 하는지 알고 싶습니다. 답변 부탁드립니다.
- 해결됨홍정모의 따라하며 배우는 C언어
재귀함수의 팩토리얼 작동원리에 대한 질문입니다.
#include <stdio.h> int r_factorial(int n); int main() { int num; printf("Input a integer : "); scanf("%d", &num); printf("%d\n", r_factorial(num)); return 0; } int r_factorial(int n) { if (n != 0) { printf("%d ", r_factorial(n - 1)); // 왜 1이 여러번 출력되는 것일까? return n * r_factorial(n - 1); // r_factorial(n) == n*r_factorial(n-1). 즉 r_factorial(n-1)의 값을 알아야 r_factorial(n)값의 반환이 가능. // 그래서 return을 바로 하지못하고 r_factorial{(n), (n-1), (n-2), ... (1)}의 값을 스택에 임시저장. // r_factorial(1) == 1*(r_factorial(0) == 1) == 1. // r_factorial(1)의 값이 나왔기 때문에 r_factorial{(1), (2), ... (n)}의 값을 차래대로 반환. // return r_factorial(n-1);은 r_factorial(n)의 값을 구하는데 쓰였기 때문에 함수의 반환값은 r_factorial(n) 1개. } else if (n == 0) return 1; else return 0; } 이번 예제를 보고 나름대로 만들고 재귀함수의 원리에 대해서도 나름대로 정리해 보았습니다. 하지만 도저히 이해가 되지않는 부분이 있어 질문 올립니다. 재귀함수의 값을 반환할때 반환값의 변화를 보다 명확히 알고싶어 printf("%d ", r_factorial(n - 1)); 를 팩토리얼 함수에 입력했습니다. 그런대 이를 출력해보면 Input a integer : 3 1 1 1 2 1 1 1 6 처럼 이상하게 반복됩니다. 팩토리얼처럼 1 2 6 으로 출력되지도 않고 어째서 이러는것인지 이유를 알고싶습니다. 그리고 혹시 재가 주석으로 정리한 재귀함수의 팩토리얼 계산법에도 오류가 있는지 알아봐주시길 부탁드립니다.
- 해결됨홍정모의 따라하며 배우는 C언어
부동소수점
부동소수점 32bit 중에서 exponent 를 표현하는 8bit를 signed 와 unsigned 로 모두 표현 가능하다고 하셨는데요. signed 일 때 -127~127이 되고 unsigned 일 때 -127 ~ 128이 되는데 맞나요? 11111111 = 255 255-127 = 128 그럼 signed일 때와 unsigned일 때 범위가 다르네요??
- 해결됨홍정모의 따라하며 배우는 C언어
realloc() 함수 질문입니다.
#include <stdio.h> #include <stdlib.h> int main() { int n = 10; int* ptr = (int*)calloc(sizeof(int), n); for (int i = 0; i < n; i++) ptr[i] = i; n = 30; int* ptr2 = (int*)realloc(ptr, sizeof(int) * n); printf("%p %p\n", ptr, ptr2); for (int i = 0; i < n; i++) printf("%d ", ptr[i]); printf("\n"); for (int i = 0; i < n; i++) printf("%d ", ptr2[i]); free(ptr2); ptr2 = NULL; return 0; } 안녕하십니까,, int* ptr2 = (int*)realloc(ptr, sizeof(int) * n); 여기서realloc()함수가 sizeof(int)*30의 힙 메모리공간을 만들고 그 공간의 첫 번째 주소를 ptr2에 전달해주고 기존의 ptr이 가리키는 힙위치의 메모리를 free해준다고 아는데 for문을 통해 ptr[i]을 출력해봤더니 출력이 되네요ㅠ ptr과 ptr2의 주소도 다르게 나오는데, realloc()함수가 기존의 ptr이 가리키는 메모리 공간을 free시켜준다고 배웠는데 제가 잘못 알고 있는걸까요??ㅠ
- 해결됨홍정모의 따라하며 배우는 C언어
버퍼를 비우는 while (getchar() != '\n'); 에 관한 질문입니다.
수고 많으싶니다. 어쩌면 정말 사소한 의문이지만 해답을 명확히 알 수가 없어 질문을 드립니다. 전 여러 예제를 풀면서 입력버퍼를 비울때 일반적으로 while (getchar() != '\n');를 사용해왔습니다. 그런대 이번 예제를 비롯하여 일부 강의에서 입력버퍼를 비우는데 while (getchar() != '\n') continue; 를 사용하는것을 보았습니다. 전 continue;를 추가하지 않아도 별다른 문제는 없었고 따로 코드를 만들어 디버그로 비교해보아도 두 방법의 차이를 알 수 없었습니다. 어째서 continue;를 추가한 것인지 이유를 알고싶습니다. 답변 부탁드립니다.
- 해결됨홍정모의 따라하며 배우는 C언어
gets() warnings 이유
#include <stdio.h> #include <string.h> void my_strcmp(void); int main() { my_strcmp(); return 0; } void my_strcmp(void) { char str1[100] = ""; char str2[100] = ""; gets(str1); gets(str2); int i = 0; int num1 = 0, num2 = 0, count = 0; while (str1[i] != '\0' || str2[i] != '\0') { if (str1[i] != str2[i]) { num1 += (int)str1[i]; num2 += (int)str2[i]; count++; } i++; } if (count == 0) printf("%d", count); else printf("%d", num1 > num2 ? 1 : -1); } 안녕하세요, strcmp함수를 나름대로 구현해 봤는데 my_strcmp 함수 안 gets에 warinings가 왜 뜨는걸까요 undefined되었다고 하는데 도저히 이유를 모르겠습니다,,ㅠ
- 미해결홍정모의 따라하며 배우는 C언어
해당 강의에서 전 메뉴를 이렇게 만들었습니다.
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { char input; int c = 0; printf("Enter the letter of your choice : \n"); printf("a. avengers\t b. beep\nc. count\t d. quit\n"); while ((input = getchar())) { if (input == 'a') { printf("Avengers assemble!\n"); } else if (input == 'b') { printf("b\a\n"); } else if (input == 'c') { printf("Enter an integer : \n"); scanf("%d", &c); for (int i = 1; i <= c; i++) printf("%d\n", i); } else if (input == 'd') { printf("Program is end\n"); break; } else printf("That's wrong. Another Key input please.\n"); while ((input = getchar()) != '\n') continue; printf("Enter the letter of your choice : \n"); printf("a. avengers\t b. beep\nc. count\t d. quit\n"); } return 0; } 이방법이 작동하는데 전혀 문제가 없고 잘 작동하지만, 강의에서도 그렇구 다른분들두 switch case를 많이 사용하시는 모습을 보고 전 전혀 switch case를 생각하지 않았거든요 ㅠㅠ 모자란점이 느껴져 아쉽습니다 ㅠㅠ 또한.. 함수사용도 하지않았네요 ㅠㅠ 코드가 아무래도 지저분해보이긴 한거같습니다.. integer가 아닌 경우도 만들어봐야겠습니다. 이러한 아쉬운점이 있는데 제 실력이 모자라기 때문이겠죠? ㅠㅠ
- 미해결홍정모의 따라하며 배우는 C언어
안녕하세요. Manifest constants 개념 관련하여 질문드립니다.
Manifest constants와 Symbolic constants는 모두 #define 또는 const 선언문을 통해 정의된 상수를 의미하는 듯 보이는데, 이 두 개를 동의어로 이해해도 될까요?
- 미해결홍정모의 따라하며 배우는 C언어
9.9 강의 관련 질문 있습니다.
선생님을 따라 다음과 같이 코드를 작성했는데, 이런 링킹 에러가 뜹니다. 컴파일 에러가 아니라 링킹 에러인 걸 보니까 코드에는 문제가 없는 거 같은데 ... 사실 이것도 잘 모르겠고 ㅠㅠ 나름 검색도 해봤는데 해결이 되지 않습니다 ㅠㅠ 왜 이런 문제가 발생하는지 어떻게 해결할 수 있는지 알려주세요 ㅠㅠ
- 미해결홍정모의 따라하며 배우는 C언어
9:40 exponent 범위 관련 질문 드립니다.
exponent 범위를 표현할 때 범위가 -126 ~ 128 라고 하셨는데,0000 0000 과 1111 1111은 특수한 용도로 사용한다고 하면실제 값을 표현할 수 있는 범위는 0000 0001 ~ 1111 1110이 되어 10진수로 표현하면 (1 - 127) ~ (254 - 127) = -126 ~ 127이 될 것 같습니다. 혹시 제가 잘못 이해한 부분이 있을까요?
- 미해결홍정모의 따라하며 배우는 C언어
궁금한게 있습니다.
위 예시에서 fscanf 의 stream 이 stdin 이면 getchar() 를 통해 int a 에 정상적으로 '\n'이 저장되는데요 stdin 이 아닌 위의 "hoho.txt" 파일을 읽을때에는 int a 에 '\n'이 저장이 되지않습니다. scanf에 %*c 를 붙이지도 않았는데 말이죠 왜그런건지 알수 있을까요? 아 그리고 강의 내용 read_book 에서 fscanf의 "%[^\n]%*c" 이걸 "%[^\n]" 로 쓰고 뒤에 while(getchar() != '\n'); 이 두 문구는 같은 내용 아닌가요?? 왜 첫번째 코드는 잘 작동하는 반면에 두번째 코드는 에러가 뜨는건지 모르겠습니다. 이거도 보니까 첫번째 질문과 관련이 있어보이네요
- 미해결홍정모의 따라하며 배우는 C언어
입력버퍼에 저장되는 시점
사용자의 입력이 언제 버퍼에 입력되는지 정확하게 알고싶습니다. 교수님께서 글자 하나하나 입력 될때마다 입력버퍼에 저장이 되고 엔터를 누르게 되면 버퍼에 저장된 내용이 목적지에 도착한다고 설명하셨는데 다른분들은 엔터가 입력 되어야 버퍼에 입력이 된다고 하셔서 혼란스럽네요. 또한 출력 버퍼의 경우 출력 버퍼가 비워진다는 것은 출력이 됨을 뜻한다고 알고 있습니다. 그렇다면 출력 버퍼는 어느 시점에 비워지게 되는건가요?
- 미해결홍정모의 따라하며 배우는 C언어
static함수 포인터 리턴
VS 2022 를 쓰는데 static으로 선언해준 변수를 포인터로 반환해줬을 때 Warning이 아니라 Error로 뜨네요. 물론 count함수, static함수 둘다 입니다. 컴파일러 차이일까요. error C2040: 'static_count': 'int *()' differs in levels of indirection from 'void ()' int ct = 0; return &ct; static int ct = 0; return &ct;
- 미해결홍정모의 따라하며 배우는 C언어
vscode external linkage
안녕하세요 교수님. vscode에서 external linkage를 시도했는데 안 돼서 구글에서 찾다가 못 찾아서 질문을 남깁니다. vscode에서는 external linkage가 안 되는 건가요? #include를 사용하는 방법으로 가능하다는 것은 알고 있습니다! 그냥 vscode에서 external linkage가 가능한지가 궁금합니다!
- 미해결홍정모의 따라하며 배우는 C언어
익명 구조체를 쓰는이유?
struct person { int id; struct { char first[20]; char last[20]; }; }; struct person2 { int id; char first[20]; char last[20]; }; 위의 코드와 아래의 코드는 접근방식이 완전히 똑같다고 볼수있는데 굳이 익명구조체를 쓸 필요가 있나요? 익명구조체만이 가지는 어떤 장점같은게 있는걸까요
- 미해결홍정모의 따라하며 배우는 C언어
동적할당에 관한 질문입니다.
이 챕터에서 질문하기에는 좀 그런거일수도 있는데... 이부분을 배웠는지 기억이 안나서요 예를들자면 강의에서의 예제를 기준으로 struct flex* pf = (struct flex*)malloc(sizeof(struct flex) + n * sizeof(double)); n 이 3일때 flexible array 의 크기를 double 형 값을 최대 3개까지 저장가능한 크기로 할당하는건데... 왜 4개 이상의 값을 넣어도 전혀 에러가 발생하지 않고 오히려 잘 작동하는지가 궁금하네요... 주소값도 8byte 간격으로 잘 나오고요. 이러면 메모리를 할당하는 의미가 없는거 아닌가요?? 제가 뭘 잘못 알고있는지 궁금합니다. 위의 구조체 말고 일반적인 동적할당에서도 똑같네요. 아 그리고 궁금한게 한가지 더있는데 구조체 변수의 주소와 구조체의 첫번째 주소값은 같잖아요 struct flex { size_t count; double value[] } 여기에서 struct flex* pf = (struct flex*)malloc(sizeof(struct flex) + n * sizeof(double)); 이렇게 했을때 pf 값과 &pf->count 의 값이 똑같은데 왜 *pf 의 값은 pf->count 의 값이 아니라 다른 이상한 값이 나오는지가 궁금합니다.
- 미해결홍정모의 따라하며 배우는 C언어
scanf 오류
- scanf 쓸려면 scanf 쓴 줄에 빨간줄이 쳐지면서 이러한 경고문이 뜨는데 어떻게 해결해야 하나요??? <경고문> 1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppBuild.targets(491,5): warning MSB8028: 중간 디렉터리(Debug\)에 다른 프로젝트(myfirstproject.vcxproj)에서 공유하는 파일이 포함되어 있습니다. 이로 인해 잘못된 정리 및 다시 빌드 동작이 수행될 수 있습니다. #define _CRT_SECURE_NO_WARNINGS은 전처리를 해줬는데..무슨 문제인지 모르겠습니다ㅠㅠ Q2)또 다른 scanf의 오류가 나타났는데요! 아래 오류에 scanf 대신 scanf_s를 사용하라는 식의 오류가 나타났는데 이 오류는 왜 발생한것인가요???
- 미해결홍정모의 따라하며 배우는 C언어
문자 입출력 관련 질문입니다
문자를 입력받을때 사용하는 자료형으로 char를 사용한다고 가르쳐주셨습니다. 다만 char는 하나의 문자만 저장이 가능하기 때문에 입력 받은 값이 두개 이상의 문자일때는 맨앞의 첫글자만 저장되고 이후 부분은 다 날아가기 때문에 char의 배열을 만드는 방법을 사용해야한다고 하셨습니다. 즉 banana 라는 값을 저장하기 위해서는 길이가 최소 7 이상의 배열을 준비해야 [b][a][n][a][n][a][\0] 의 형태로 저장이 가능하다고 이해를 했습니다. 1. 다만 일일이 입력하려고 하는 값의 크기 이상의 길이를 가진 배열을 초기화하는 것이나, 배열을 출력할때 사소하지만 그래서 더 놓치기 쉬운 출력문의 변경점 등의 이유로 다소 번거롭다고 느꼈는데, c의 자료형에는 java의 string과 같이 문자열 자체를 입력 받을 수 있는 자료형은 없나요? 2. char의 배열을 이용해 문자열을 입력했을때 중간에 스페이스바로 공란을 입력하니 공란 이후의 값이 출력되지 않았습니다. char에 공란은 저장을 못하기 때문에 이후 값이 날아간건가요?