묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨홍정모의 따라하며 배우는 C언어
14.26강 연습문제 질문이 있습니다.
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <ctype.h> #include <stdlib.h> #include <stdbool.h> void update_string(char*, int(*)(int)); void ToUpper(char*); void ToLower(char*); void Transpose(char*); // TO DO : add a new menu int main(void) { char options[] = { 'u', 'l' }; int n = sizeof(options) / sizeof(char); // 함수 포인터의 배열 typedef void (*FUNC_TYPE)(char*); FUNC_TYPE operations[] = { ToUpper, ToLower }; printf("Enter a string\n>> "); char input[100]; while (scanf("%[^\n]%*c", input) != 1) printf("Please try again.\n>> "); printf("Choose an options:\n"); printf("u) to upper\n"); printf("l) to lower\n"); char option_choice; while(scanf("%[^\n]%*c", &option_choice) != 1) printf("Please try again.\n>> "); // 선택한 옵션에 따라 대문자/소문자로 변경 // options 배열을 순회하며 options에서 선택한 옵션의 index 추출 int option_choice_index = 0; for (int i = 0; i < n; ++i) { if (options[i] == option_choice) { option_choice_index = i; break; } } // 문자열 변경 함수 실행 update_string(input, operations[option_choice_index]); // 문자열 출력 puts(input); return 0; } // 문자열 전체를 대문자/소문자로 변경하는 함수 void update_string(char* str, int(*ptr_func)(int)) { char* arg1 = str; int(*arg2)(int) = ptr_func; (*ptr_func)(str); }; // 문자열 전체를 대문자로 변경하는 함수 void ToUpper(char* str) { char* arg3 = str; while (*str != '\0') { *str = toupper(*str); str++; } }; // 문자열 전체를 소문자로 변경하는 함수 void ToLower(char* str) { while (*str != '\0') { *str = tolower(*str); str++; } }; update_string 함수에서(*ptr_func)(str);를 실행할 때까지 str의 주소가 잘 잡힙니다.그런데 (*ptr_func)(str);를 실행해서 ToUpper 함수 안으로 진입하면 str의 주소가 잡히지 않는데 왜 이런지 잘 모르겠습니다..
-
해결됨독하게 시작하는 C 프로그래밍
선생님 질문 있습니다.
매번 질문에 답해주셔서 너무 감사합니다이번 내용 이해하기 쉽게 해주셔서 머리에 쏙쏙 들어왔습니다.혹시 이 코드들 중에 문법적으로 오류나 아니면 이렇게 하는 습관(?)은 안 썼으면 하는 게 있으시다면 알려주세요! 미리 감사드립니다.😊
-
미해결홍정모의 따라하며 배우는 C언어
8분 40초경 질문
int sum2d_2(int ar[][COLS], int row);에서 COLS 자리의 인덱스에 숫자를 적어주는 이유는ar이라는 포인터의 행의 사이즈는 int * (COLS 자리의 인덱스) 이기 때문이다.라고 해봤는데 이게 맞거나 비슷한 표현 일까요?제 표현이 틀린 것 같아 답변자 분이 이해를 할 수 없을 것 같기도 하네요.. ㅈㅅ함미다.
-
해결됨홍정모의 따라하며 배우는 C언어
6분 54초경 질문
그냥 그렇나 보다 하고 지나칠뻔한 걸 한번 의심을 하니 문제를 놓을 수가 없게 되었습니다. 1.int ar1[2][3] = { {1, 2, 3}, {4, 5, 6} };int* pt;pt = &ar1[0][0];for (int i = 0; i < 6; ++i)printf("%d %d ", pt[i], *(pt + i)); 2.int arr[2][3] = { {1, 2, 3}, {4, 5, 6} };int* parr[2];parr[0] = arr[0];parr[1] = arr[1];for (int i = 0; i < 2; ++i)printf("%p %p ", parr[i], *(parr + i)); 둘 다 똑같이 출력을 했는데 1번 예제는 값이, 2번 예제는 주소가 출력 되는 이유그러니까 parr[i]가 주소를 출력하니 pt[i]도 주소를 출력 해야 할 것 같은데 값을 출력하는 이유가 궁금합니다.parr은 포인터의 배열이고 pt는 포인터라서?parr의 자료형은 int (*)[3]이고 pt의 자료형은 int*라서?뭔가 연관이 있을 텐데 저는 어떤 연관이 있는 건지 쉽사리 연결 지을 수가 없더라구요.꼭 알려주셨으면 합니다. 항상 좋은 답변 감사합니다.
-
미해결홍정모의 따라하며 배우는 C언어
릴리즈모드 디버그모드 scnaf 오류
릴리즈 모드가 아니라 디버그 모드를 사용해서 i와j의 합을 볼려했는데 왜 디버그 모드상태에서 scanf를 사용하면 오류가 나나요??
-
해결됨홍정모의 따라하며 배우는 C언어
14.24강 09:54 질문이 있습니다.
앞에 말씀하신 부분 중 함수 실행의 결과로 배열을 반환할 수 없다고 하셨었는데 그러면 09:54에서 식별자 x2는 함수 포인터 배열의 포인터가 되는건가요???int(*x2[10])(int);
-
해결됨홍정모의 따라하며 배우는 C언어
scanf()의 작동 원리(?)에 관한 질문 (따배C - 8.7)
#include <stdio.h> int main() { /* Assume that your input is : Hello 123 3.14 */ char str[255], tmp; int i = 0, i2 = 0; double d = 0.0; scanf("%s %d %lf", str, &i, &d); // POINT1 printf("%s %d %f\n", str, i, d); // or (see the difference) scanf("%c", &tmp); // POINT2 printf("My input was %c!!!\n", tmp); // POINT2_1 scanf("%s %d %d", str, &i, &i2); // POINT3 printf("%s %d %d\n", str, i, i2); // or (see the difference) char c; while ((c = getchar()) != '\n') putchar(c); printf("\n"); return 0; }안녕하세요 강의를 듣다가 평소에는 무심코 지나쳤던 부분이 눈에 밟혀 질문 드립니다.POINT1에 정상적인 값들을 입력하고 Enter를 누르면 POINT2에서 '\n'이 입력되고 POINT2_1에서 '\n'이 출력된 것을 확인했습니다.그렇다는 것은 버퍼에 '\n'이 남았다는 것을 알 수 있습니다.여기서 궁금증이 생겼습니다.POINT2, POINT2_1을 지우고 실행하면 왜 POINT3에서 정상적인 값들을 입력했을 때 str에 '\n'이 입력되지 않는지 궁금합니다.처음에는 printf() 함수가 알아서 버퍼를 비워주나 생각했었지만 POINT2, 2_1을 통해 그건 아니라는 것은 확인했습니다.그래서 제 딴에 생각한 것은'scanf() 함수에서 여러 개의 값들을 입력 받으면 (한 개의 값만 입력 받을 때와 달리) 버퍼에 남아있던 '\n'을 자동으로 무시해 주는 것이다.'인데 이것이 맞는지 궁금합니다.
-
해결됨독하게 시작하는 C 프로그래밍
32bit 와 64bit 자료형 크기
정수형 강의 내용 중 long 자료형 크기에 대해 궁금한 점이 생겨 질문드립니다! 64비트 기준으로, long 자료형이 4바이트라고 설명해 주셨는데, sizeof 연산자로 long 변수 크기를 확인할 경우 8바이트로 나오게 되어 질문드립니다.제목과 같이 32와 64간 자료형의 크기를 비교한 자료가 있을까요?? 검색 결과 작성자마다 약간씩 차이를 보여 질문드립니다. 감사합니다.
-
미해결IT 기업 취업을 위한: 코딩테스트 혼자서 정복하기 (C/C++)
이해가 안되는 부분이 있습니다.
안녕하세요 선생님 질문이 하나 있습니다. dp(6-5) = dp(1)이고 dp(6-3)은 dp(3)을 나타내고이제 6번째 배열에서 Min(dp(1)+1, dp(3)+1)에서 최소값은 왼쪽 dp(1)+1이 아닌가요? 왜 dp(3)+1로 된건지 이해가 안갑니다. 대괄호가 기입이 안돼 소괄호로 대체합니다.
-
미해결C 와 C++ 을 동시에 배워보자 - 두들낙서의 C/C++
float 출력관련 질문
#define CRTSECURE_NO_WARNINGS#include <stdio.h>int main() { float a, b; scanf("%f%f", &a, &b); //&:포인터 float hap = a + b; float cha = a - b; float gop = a * b; float mok = a / b; printf("%f + %f = %f\n", a, b, hap); printf("%f - %f = %f\n", a, b, cha); printf("%f * %f = %f\n", a, b, gop); printf("%f / %f = %f\n", a, b, mok);} 코드는 대략 이러한데, 예시로 입력값을 555.3과 234를 넣으면 555.299988과 234를 기준으로 계산이 됩니다. 왜 그런지 아시는 분이 혹시 계시다면 답변해주시면 감사드리겠습니다.
-
해결됨[쥬신게임아카데미 버거쌤] 완전 초보자를 위한 게임 C++
컴파일러 셋팅 및 코딩의 시작에서
폰트 자료 올려두셨다는 곳이 어디예요...????
-
해결됨독하게 C를 배운 사람을 위한 선형 자료구조
연결리스트 삭제 시 헤드노드 NULL인 경우 예외처리의 필요성 재고
연결리스트 삭제 시 헤드노드가 NULL인 경우를 고려해야 하는 이유가 궁금합니다. 삭제 전에 삭제할 노드를 미리 찾는 과정이 수반되는데, 그 과정은 헤드노드가 NULL값이 아니라는 것을 전제로 이루어집니다. 따라서 삭제할 노드를 찾아서 삭제를 진행하는 단계까지 왔다는 것은 헤드노드가 NULL이 아니라는 것을 전제로 한다고 볼 수 있습니다. 그럼에도 불구하고 삭제를 진행하는 함수에서 헤드노드가 NULL인 경우를 고려하시고 이에 대한 예외처리 코드를 작성하셨는데, 혹시 그에 대한 이유가 있을까요?
-
해결됨독하게 시작하는 C 프로그래밍
한 솔루션 안에 여러 프로젝트
강사님 안녕하세요 항상 질좋은 강의 감사드립니다.올려주신 예제파일처럼 한 솔루션 파일 안에 여러 프로젝트를 넣는 방법은 무엇인지 궁금합니다.프로젝트를 생성하면 아예 새로운 솔루션으로 생성이 되어버려서요,,
-
미해결홍정모의 따라하며 배우는 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); }