묻고 답해요
156만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결홍정모의 따라하며 배우는 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 프로그래밍
필수실습문제-버블정렬 설명에 대한 질문
강사님께서 설명하시는 버블정렬에 대한 설명을 듣고 질문 드립니다.해당 영상의 초기 부분에 버블정렬에 대해 설명을 해주시는데, 해당 설명이 버블정렬에 대한 설명이 맞는지 문의드립니다.설명해주신 내용은 선택 정렬이 아닐까 생각이 듭니다.버블정렬은 맨 왼쪽 부터(작은수) 정렬되는 것이 아닌 가장 오른쪽(큰 수)부터 정렬이 되는 것으로 알고 있습니다.1회차에서 가장 큰 값이 정해지고 그 다음 회차를 반복하면서 그 다음 으로 큰 수가 정해지는 방식으로 알고 있는데요, 그런데 영상 속 설명에서는 가장 왼쪽 값(작은 수)가 정해지면 1회차가 종료되며, 그 뒤에 그 다음으로 작은 수를 구하는 방식으로 진행하는 것으로 설명하는 것으로 보입니다.확인 부탁드립니다감사합니다. 참조 링크: https://ko.wikipedia.org/wiki/%EB%B2%84%EB%B8%94_%EC%A0%95%EB%A0%AC
-
미해결홍정모의 따라하며 배우는 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 프로그래밍
필수 실습문제 '*' 출력놀이 응용 부분 관련 질문
#include <stdio.h>int main(void){ for (int i = 0; i < 5; ++i){for (int j = 0; j < 5; ++j){if (i + j < 4)printf(" ");elseprintf("*");} printf("\n");}for (int i = 0; i < 5; ++i){for (int j = 0; j < 9; ++j){if (i + j < 5 || j - i > 5)printf(" ");elseprintf("*");} printf("\n");} return 0;}이런 식으로 코드를 짰는데 제가 보기엔 제 코드에 문제가 없는데 삼각형 문제에서 출력 결과가 사진과 같이 나와요 i가 4이고 j가 8일 때 왜 "*"이 아닌 " "가 출력 되는지 모르겠어요.
-
미해결홍정모의 따라하며 배우는 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 프로그래밍
이 부분에 오류가 있는지 궁금합니다.
제가 문제를 풀다 보니 이런 식으로 항A 값에 식을 만들어 버렸습니다.오류 없이 잘 진행되고 값도 잘 나오고 해서 문제 없다고는 생각합니다만혹시 제가 모르는 오류가 있을까봐 질문드립니다.미리 감사드립니다 ^^
-
해결됨홍정모의 따라하며 배우는 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]을 출력하고 있어요.제가 잘못 이해한 게 맞을텐데 뭐가 잘못된 건지 모르겠어요 도와주세요질문이 너무 많아서 죄송합니다 제가 질문 게시판을 어지럽히는 것 같네요 ㄷㄷ
-
해결됨독하게 시작하는 C 프로그래밍
정수형 - char
기초적인 질문이지만..char의 음수부분 어떤때에 사용하는지 궁금합니다.char 의 양수 번호같은 경우는 ascii코드 베이스로 사용하는걸 알겠는데 음수부호를 가지고 char를 사용하게 되는 경우는 어떨때 사용하는걸까요? 그리고 어떤때에 unsigned char를 사용해야하는가도 궁금하네요..ㅎ
-
해결됨[쥬신게임아카데미 버거쌤] 완전 초보자를 위한 게임 C++
c++ 다음 강의 계획이 궁금합니다.
안녕하세요?c++ 다음 커리큘럼은 개강일과 다루는 내용이 궁금합니다!
-
미해결홍정모의 따라하며 배우는 C언어
9분 20초경 질문
*(parr[j] + i)과 *(*(parr + j) + i))는 어느정도 이해를 했습니다.예를 들면*(parr[0] + 1)parr[0]에 담긴 데이터는 주소이고 그 주소는 arr0이라는 포인터와 비슷한 무언가를 가리킨다.그리고 arr0이라는 포인터와 비슷한 무언가는 arr0[0]의 주소를 가리킨다.그리고 arr0[0]은 arr0의 첫 번째 공간을 의미한다.그러므로 parr[0]은 arr0[0]을 가리키는 것이고 parr[0]에 1을 더하면 arr0[0]의 다음 공간인 arr0[1]을 가리키게 되고*로 그 공간에 접근하게 된다.*(*(parr + 1) + 1)parr은 arr0을 가리킨다. 그리고 arr0은 arr0[0]을 가리킨다.그러므로 parr에 1을 더하면 arr0[1]을 가리키게 된다.거기에 *를 붙이면 arr0[1]의 공간에 있는 데이터에 접근을 한다.거기서 1을 더하면 그 데이터에 1을 더하게 되는 것이다.이렇게 이해를 했는데 맞는거겠죠?이거 말고 질문이 있는데parr[j][i]와 (*(parr + 1))[1]의 맨앞에 *가 없는데도 어떻게 그 공간에 접근해서printf 함수로 출력을 했을 때 배열의 주소가 아닌 배열의 데이터가 출력 될 수 있는 건지 궁금합니다.parr[j]는 배열의 주소가 나오는데 parr[j][i]는 왜 배열의 값이 나오는지 이해가 안되요.감사합니다
-
해결됨홍정모의 따라하며 배우는 C언어
int* 변수명과 int *변수명의 차이
int* 변수명과 int *변수명이 해석하는데 차이가 있다고 했는데이게 해석상으로 어떤 차이가 있는 건지 궁금합니다.전 강의에서 어떻게 얘기를 해주신 거 같은데 그 때도 이해를 제대로 못했어요
-
해결됨독하게 시작하는 C 프로그래밍
buffer란 H/W인가요 S/W 인가요?
강의에서 buffer란 ram의 일부분에 속해 있다고 하셨는데 후에 "hello world"를 print하는 과정에 대해 설명하실 때 file(인터페이스)에 buffer 공간이 있다고 하셔서 헷갈립니다
-
미해결홍정모의 따라하며 배우는 C언어
vsc반드시깔아야하나요
자꾸 오류나고 교수님이 하시는건 제것엔 안되고 답답하기만 한데 걍 visual studio만 써도 되죠?
-
해결됨독하게 시작하는 C 프로그래밍
예제 파일은 어디서 다운 받을 수 있나요?
예제 파일은 어디서 다운 받을 수 있나요?
-
해결됨독하게 시작하는 C 프로그래밍
Little-Endian에 대해서 궁금합니다.
제가 이해한 대로 말씀드리자면 저희가 사용하는 intel의 cpu가 기본적으로 Little-Endian 방식을 채택한다고 하셨습니다.제가 사용하는 AMD의 cpu도 메모리 주소가 반대로 찍힙니다 그럼 AMD도 Little-Endian을 채택하는 것으로 이해하고 있으면 될까요??