월 19,800원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨홍정모의 따라하며 배우는 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도 해봤는데 오류도 안나고 뭘 잘못한건지 궁금합니다
- 미해결홍정모의 따라하며 배우는 C언어
str[] or str
void print_centered_str(char str[]) 여기서 char str이랑 char str[] 과 어떤 차이가 있나요? char str 을 실행해봤는데 원하는 출력이 나오지 않았습니다. 왜 다르게 나오는지 궁금합니다.
- 미해결홍정모의 따라하며 배우는 C언어
강의 7:35
stop을 입력하셨을 때 문제가 발생한 이유가 else에서 입력버퍼를 지워주지를 않아서 첫 번째 c = 's'가 되서 else문 실행 (입력 버퍼에 s는 지워지고 't' 'o' 'p' '\n'만 남음) 두 번째 c = 't'이므로 else문 실행 (입력 버퍼에 t는 지워지고 'o' 'p' '\n'만 남음) 이런식으로 진행되서 cmd창에 Please input y or n Current count is 0.Continue?(y/n) 이 두 줄이 버퍼의 수?(s, t, o, p, \n)만큼 총 5번 반복된거로 이해하면 되나요?
- 미해결홍정모의 따라하며 배우는 C언어
강의 4:35초
while (getchar() ! = '\n') continue; 이 식이 같은 줄에 입력한 앞에 한글자 빼고 줄바꿈이 나오기 전까지 무시하겠다. 라고 말씀하셨는데 그 과정이 어떻게 이루어지는지 모르겠습니다. 왜 한 글자만 빠지고 그 다음부터 무시하겠다는 건가요?
- 미해결홍정모의 따라하며 배우는 C언어
함수호출위치 및 메모리
강의를 보는 중간에 항상 함수 호출은 main 함수에서 하던데 비주얼스튜디오에서 main함수위에 하면 오류가 뜨더라고요예를들어 #include <stdio.h> int func(int num) { int result = num + 3; printf("%d", result); return result; } func(3); void main(void) { } 이렇게 변수처럼 전역변수자리에 함수호출은 허용안되는 건가요? 만약에 된다고 하면 항상 main함수부터 실행한다고 했는데 어떻게 되는건가요?또한 전역변수처럼 메모리에 끝까지 남아있는건가요?
- 미해결홍정모의 따라하며 배우는 C언어
비주얼 스튜디오 상에서 strlen 함수 사용시 경고 C6001이 뜨는 이유가 궁금합니다.
#include <stdio.h> #include <string.h> //strlen and more int main() { char str1[100] = "Hello"; char str2[] = "Hello"; char str3[100] = "\0"; char str4[100] = "\n"; printf("%zu %zu\n", sizeof(str1), strlen(str1)); //C6001 printf("%zu %zu\n", sizeof(str2), strlen(str2)); printf("%zu %zu\n", sizeof(str3), strlen(str3));//C6001 printf("%zu %zu\n", sizeof(str4), strlen(str4));//C6001 return 0; } 4.4 strlen() 함수 0:48초 부분인데 강의에서는 아무런 워닝이 뜨지 않지만 제 비주얼 스튜디오 상에서는 str2를 제외한 str1, str3, str4에서 워닝 C6001이 발생합니다. Using uninitialized memory 'str1' Using uninitialized memory 'str3' Using uninitialized memory 'str4' 근데 온라인 gcc 컴파일러에서는 아무런 워닝도 뜨지 않고, 강의 상에서의 비주얼 스튜디오에서도 아무런 워닝이 생기지 않아서 제 생각으로는 아마도 비주얼 스튜디오가 업데이트 되면서 생긴 문제 같은데 왜 이런지 이유를 알 수 있을까요? 현재 Microsoft Visual Studio Community 2019 Version 16.11.5을 사용하고 있습니다.