무료
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결C 프로그래밍 - 입문부터 게임 개발까지
파일 열기 실패
선생님이 말씀하신대로 코드를 작성하고 실행해보니 파일 열기 실패가 떠요. 요거는 어떻게 해야 하나요? 아레에는 제가 작성한 코드입니다 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #define MAX 10000 int main(void) { // 파일 입출력 // 파일에 어떤 데이터를 저장 // 파일에 저장된 데이터를 불러오기 // fputs, fgets 쌍 char line[MAX]; // char line[10000]; FILE* file = fopen("c:\\test1.txt", "wb"); // r(읽기 전용) w(쓰기 전용) a(이어쓰기), t(텍스트) b(바이널 데이터) if (file == NULL) { printf("파일 열기 실패\n"); return 1; } fputs("fputs 를 이용해서 글을 적어볼게요\n", file); fputs("잘 적히는지 확인해주세요\n", file); // 파일 열고 안닫고 문제생기면? // 데이터 손실 발생 가능 // 닫아주는 습관 가지기 fclose(file); // fprintf, fscanf 쌍 return 0; }
- 미해결C 프로그래밍 - 입문부터 게임 개발까지
문자 배열의 크기를 지정할 때요
경찰서 조서 프로젝트 할때 name[] 배열의 크기를 256으로 했잖아요? 예를 들어 john으로 이름을 지었다면 5의 크기를 가지는데, 그럼 나머지 251이 남잖아요. 이때 남은 251 이라는 크기의 데이터는 그저 낭비가된 채로 남아 있는건가요?
- 미해결C 프로그래밍 - 입문부터 게임 개발까지
저 죄송하지만 질문이있습니다...
제가 작성한 내용이 잘 저장되었나 확인하고 싶어서 텍스트파일을 한번 열어봤는데 이렇게 저장이되는데 왜이러는거죠...?
- 미해결C 프로그래밍 - 입문부터 게임 개발까지
마지막 질문이 되길 바라며~~~ㅜㅠ 죄송함다 선생님~~
1. 선생님~~~ 한글로 비밀번호를 입력할 때 말구요. 그냥 저 cmd(라고해야하나..)에서 한글을 입력할 때의 상황인데요. 선생님께서는 입력 순간마다 바로 글자가 표시가 되는데, 저는 한글자를 다 입력하고나서, 다음 글자를 입력시작해야만 전 글자가 표시가 되요. 밑에 비교 영상을 링크로 첨부할테니 꼭 좀 봐주세요~~ 1) 선생님 https://drive.google.com/open?id=187LKSdpoWDkxE31c7s3JJnhhxDGMQpyi 2) 저 https://drive.google.com/open?id=1l0rPhEGufVORw9SzpKYbXjeTrn7PTi10 2. 백스페이스바는 잘 해결했습니다. 3. 엔터(줄바꿈)입력에 대해서.... 선생님께서 첨부해주신 예제코드는 아주 잘 실행되고, 줄바꿈또한 잘 입력이 됐음을 확인했습니다. 그리고 나서 선생님께서 말씀해주신대로 scanf를 scanf_s로 바꿔서 실행해봤는데요. (비밀번호 틀린 횟수 검사를 코드로 한번 추가해봤습니다. ㅎㅎ) #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #define max 500 // 비밀번호를 입력받아서 // 맞는 경우? 일기를 읽어와서 보여주고, 계속 작성할 수 있도록 합니다. // 틀린 경우? 경고 메시지를 표시하고, 종료합니다. int main() { char line[max]; // 불러오기를 했을 때, 불러올 내용이 저장된 배열(줄). char contents[max]; // 일기장에 입력하고 저장할 내용. char password[20]; // 비밀번호 int c; // getch 함수의 리턴값(문자 하나하나가 아스키코드값으로 바뀌어 저장된다.)을 검사할 변수. printf("'비밀일기'에 오신 것을 환영합니다.\n"); printf("비밀번호를 입력하세요. : "); int n = 0; // 비밀번호 오류 횟수 검사 변수. while (1) { // 비밀번호 오류 횟수 검사를 확인 후, 일기를 쓸 수 있도록. if (n == 3) { printf("\n==== 비밀번호를 %d회 틀렸어요. ====\n", n); printf("==== 비밀일기를 종료합니다. ====\n\n"); break; } // 비밀번호 입력 알고리즘 int i = 0; // 비밀번호 배열의 순서를 의미하는 변수 while (1) { c = getch(); // 입력한 문자들이 getch로 바로바로 입력이 되어, 한 글자씩 변수 c에 저장된다. if (c == 13) { // (Enter의 아스키코드가 13이다.) 입력한 문자가 Enter(줄바꿈 : \n)라면. -> 비밀번호 입력 종료를 위한 조건식. password[i] = '\0'; // i번째에 데이터를 널문자(끝낼수 있도록)를 넣는다. break; // 비밀번호 입력 종료. (반복문 탈출) } else if (c == 8) { // (백스페이스바의 아스키코드가 8이다.) 백스페이스바를 입력하면, 즉 비밀번호를 지우면 if (i >= 1) { // 두번째 이상의 위치에 커서 있을 때 백스페이스바를 입력할 때. password[i - 1] = '\0'; /*i번째에서 커서거 있고, 그 위치에서 Backspace를 입력하는 것이니, 그 전 자리인 'i-1'번째 자리의 데이터를 지워야한다.*/ printf("\b \b"); /*\b는 현재 데이터를 입력하는 위치에서 왼쪽(전)으로 커서를 이동시켜주는 변환문자. 그러니, 왼쪽으로 한번 커서 이동후에, 스페이스바를 입력하여 빈칸이 되게 만들어주고, 스페이스바를 입력했으니 다시한번 뒤로 커서가 이동해야한다.*/ //printf("\b"); //printf(" "); //printf("\b"); 요렇게 따로 써주어도 될 듯하다. i -= 2; } else { i--; /*커서가 첫번째 위치에 있을 때, 즉 i=0일 때, 백스페이스바를 입력하면, 지울 데이터는 없으니 아무것도 하지 않고, 키를 하나 입력할 때마다, i++로 반복문이 반복되니, 백스페이스바를 입력해도 배열이 앞자리로 이동하지 않도록, i--를 해준다.*/ } } else { // Enter와 백스페이스바 둘 다 아니라면. password[i] = c; // getch를 써서 계속 입력하여 c에 저장된 글자들이 password 배열에 저장된다. printf("*"); // 입력할 때마다, 비밀번호는 감추고, 대신 '*' 요놈을 출력할 것이다. } i++; } printf("\n\n==== 비밀번호 확인 중.... ====\n"); // 1. 비밀번호가 맞다면, 일기를 작성하자. (strcmp는 문자열 함수를 보면 복습할 수 있다.) if (strcmp(password, "skehzheld") == 0) { printf("==== 비밀번호 확인 완료 ====\n\n"); // 파일 선언. (비밀번호가 맞아야지만 파일이 생성될테니까 여기에 배치). char* fileName = "c:\\Users\\최윤성\\Desktop\\비밀일기.txt"; FILE* file = fopen(fileName, "a+b"); /*"a+b"는 파일이 없으면 생성하고, 있으면 append(뒤로 내용을 추가)한다는 의미. 내용 추가가 아니라, 내용 수정을 원한다면 저 뒤의 매개변수를 어떻게 바꿀까?*/ // 파일 열기. if (file == NULL) { printf("*****파일 열기 실패*****\n\n"); return 1; } else printf("*****파일 열기 성공*****\n\n"); printf("------------------------오늘의 일기--------------------------\n\n"); // 여기서부터 이전 일기 출력. while (fgets(line, max, file) != NULL) { // 저장된 파일을 불러온다. printf("%s", line); // 불러왔으면 출력한다. } // 처음 쓰면 아무것도 불러올 것이 없을 것이고, 쓴 문장이 있었다면, 썼던 문장들이 불러오게 될 것이다. printf("\n┗ 여기까지가 이전 일기..\n내용을 계속 작성하세요. 종료하시려면 마지막 줄에 \"fin\"을 입력하세요. ┒\n\n"); // 여기서부터 새로운 (추가)일기 입력 후, 저장하고 끝내기 while (1) { scanf_s("%[^\n]", contents, max); // 줄바꿈(\n)이 나오기 전까지, 모든 문자열을 다 입력한다 뜻의 변환 문자이다. 즉, 한 문장씩 저장을 하겠다는 의미. getchar(); // scanf를 사용하기 위해 버퍼에 저장되어 있던 '\n'을 버림처리 한다. if (strcmp(contents, "fin") == 0) { // 일기 입력 끝. printf("---------------------오늘의 일기 : 끝------------------------\n\n"); break; } // 무한반복이니, scanf로 입력하는 모든 문장들은 "fin"이 나오기 전까지, 한 문장씩 전부 기억한다. fputs(contents, file); // 그 한 문장 한 문장을 바로바로 저장한다. fputs("\n", file); // 줄바꿈까지 저장한다. 그리고는 "fin"을 입력하여 종료되기 전까지 계속반복. } //// 잘 저장되어 있는지 출력해서 검사해보자. //while (fgets(line, max, file) != NULL) { // printf("%s", line); //} // ?? 왜 안되지?? // 파일 닫기. int res = fclose(file); // 파일 닫기 함수 리턴값 검사를 위한 변수. if (res != 0) { printf("*****파일 닫기 실패*****\n\n"); return 1; } else printf("*****파일 닫기 성공*****\n\n"); // 결국 파일이 종료된다. 파일 닫기. break; // 비밀번호가 맞았으니, 여기까지 수행한 후, 비밀번호 오류검사 횟수 반복문을 탈출하여 끝낸다. } // 2. 비밀번호가 틀리다면. 다시 한번 기회를 줘보자.... else { n++; if (n <= 2) { printf("\n==== 비밀번호를 %d회 틀렸어요. ====\n", n); printf("==== 비밀번호를 다시 입력하세요. ====\n\n"); printf("비밀번호를 입력하세요 : "); } continue; // 비밀번호가 틀렸으니, 조건문을 처음부터 다시 실행. } } return 0; } 여기까지가 현 상황입니다. 부탁드림돠 선생님~~~~~~ (열심히 배우려다보니 선생님께 폐를 끼치게 되네요;;)
- 미해결C 프로그래밍 - 입문부터 게임 개발까지
선생님.....또 질문이요......
선생님 자꾸 질문이 너무 많아서 정말 죄송합니다. 열심히 공부하려다 보니 그렇구나로 이해해주시면 정말 감사하겠습니다. getchar();에 대해서는 이해가 됐습니다. 친절한 설명 정말 감사합니다. 질문 한방에 다 할게요 1. 한글 동시입력에 대해서 답해주셨는데, 말씀하신 다른 부분이란, 제가 어찌 설정할 방법이 없는건가요? 혹여나 설명가능하거나 제가 참고할 만한 글이 있다면 링크라도 달아주시면 정말 감사하겠습니다. 2. 비밀번호 수정에 관한 코드도 정말 감사합니다. 써주신대로 이해가 됐습니다. 하나 더 질문이 있는데, (도통 코드를 짜지 못하겠어서요). 백스페이스바를 계속 입력할수도 있지 않습니까? i=0이 되더라도 말이죠. 그럴때 오류가 안나게하기 위해서는 어떤 코드를 짜면 좋을까요? (그냥 선생님의 정확한 생각으로 코드를 알려주시면 정말 감사하겠습니다.) 3. 줄바꿈 문자 입력에 관한 내용인데요. 선생님께서 첨부해주신 코드를 사용해도 엔터를 입력하면 쓰레기 값이 입력됩니다. 제 코드를 비교해도 다른 점이 없는데 말이죠....... 어떤것이 문제인지 코드 올릴테니 봐주세용 ㅜㅠㅜㅠ #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #define max 1000 // 비밀번호를 입력받아서 // 맞는 경우? 일기를 읽어와서 보여주고, 계속 작성할 수 있도록 합니다. // 틀린 경우? 경고 메시지를 표시하고, 종료합니다. int main_4() { char line[max]; // 불러오기를 했을 때, 불러올 내용을 저장할 곳(변수) char contents[max]; // 일기장에 입력할 내용. char password[20]; // 비밀번호 int c; // getch 함수의 리턴값을 검사할 변수. printf("'비밀일기'에 오신 것을 환영합니다.\n"); printf("비밀번호를 입력하세요. : "); // getchar();와 getch();란? : 한 글자씩 입력하는 함수. 널문자까지 문자로 인식한다. // getchar(); : Enter를 입력해야 동작을 한다. // getch(); : 키 입력만 하면, 바로바로 동작을 한다. int i = 0; while (1) { // for 구문을 써도 된다. c = getch(); // 입력한 문자들이 getch로 바로바로 입력이 되어, 한 글자씩 변수 c에 저장된다. if (c == 13) { // 입력한 문자가 Enter(줄바꿈 : \n)라면. (Enter의 아스키코드가 13이다.) password[i] = '\0'; // i번째에 데이터를 널문자(끝낼수 있도록)를 넣는다. /*참고로, getch():는 한 글자씩 입력하는 함수인데, 응용해서 한 줄의 문자를 입력하는 함수지만, 더 응용해서 여러줄을 입력하기도 한다. 줄바꿈을 할 때 Enter를 입력하고, 여러 줄의 문장을 끝낼 때 ctrl+z를 입력한다. Enter로 줄바꿈을 하면 입력될 데이터는 '\0'이지만, ctrl+z로 줄바꿈을 하면 -1을 리턴값으로 가진다. 그래서 -1을 위해서 int형 변수로 선언해야한다.*/ break; // 비밀번호 입력 종료. } else if (c == 8) { // 백스페이스바를 입력하면, 즉 비밀번호를 지우면 (백스페이스바의 아스키코드가 8이다.) password[i - 1] = '\0'; // i번째에서 Backspace를 입력하는 것이니, 그 전자리인 'i-1'번째 자리의 데이터를 지워야한다. printf("\b \b"); /*\b는 현재 데이터를 입력하는 위치에서 왼쪽(전)으로 커서를 이동시켜주는 변환문자. 그러니, 왼쪽으로 한번 커서 이동후에, 스페이스바를 입력하여 빈칸이 되게 만들어주고, 스페이스바를 입력했으니 다시한번 뒤로 커서가 이동해야한다.*/ i = i - 2; // 'i-1'번째 데이터를 지웠으니, 'i-2'번째 데이터까지만 입력이 완료된다. 44번줄에 i++이 있으니, 이렇게 입력해주는 것이 옳다. } else { // Enter를 입력하지 않으면. password[i] = c; // getch를 써서 계속 입력하여 c에 저장된 글자들이 password 배열에 저장된다. printf("*"); // 입력할 때마다, 비밀번호는 감추고, 대신 '*' 요놈을 출력할 것이다. } i++; } char* fileName = "c:\\Users\\최윤성\\Desktop\\secretdiary.txt"; FILE* file = fopen(fileName, "a+b"); // "a+b"는 파일이 없으면 생성하고, 있으면 append(뒤로 내용을 추가)한다는 의미. printf("\n\n==== 비밀번호 확인 중.... ====\n\n"); if (strcmp(password, "skehzheld") == 0) { // 1. 비밀번호가 맞다면 (strcmp는 문자열 함수를 보면 복습할 수 있다.) printf("==== 비밀번호 확인 완료 ====\n\n"); if (file == NULL) { printf("*****파일 열기 실패*****\n\n"); return 1; } else printf("*****파일 열기 성공*****\n\n"); // 파일 개방. while (fgets(line, max, file) != NULL) { printf("%s", line); } // 파일을 불러온다. 처음 쓰면 아무것도 불러올 것이 없을 것이고, 쓴 문장이 있었다면, 썼던 문장들이 불러오게 될 것이다. printf("\n\n내용을 계속 작성하세요. 종료하시려면 \"끝\"을 입력하세요.\n\n"); while (1) { scanf("%[^\n]", contents); // 줄바꿈(\n)이 나오기 전까지, 모든 문자열을 다 입력한다 뜻의 변환 문자이다. 즉, 한 문장씩 저장을 하겠다는 의미. getchar(); // 입력한 줄바꿈(Enter:\n)을 Flush(버림) 처리한다. if (strcmp(contents, "끝") == 0) { printf("비밀일기 입력을 종료합니다.\n\n"); break; } // 무한반복이니, scanf로 입력하는 모든 문장들은 "끝"이 나오기 전까지, 한 문장씩 전부 기억한다. fputs(contents, file); fputs("\n", file); // 입력된 문장들은 바로바로 저장이 된다. "끝"을 입력하여 종료하기 전까지 계속. } } else printf("==== 비밀번호가 틀렸어요. ====\n"); // 2. 비밀번호가 틀리다면. 틀렸다고 말하고. 바로 밑으로 항해서 int res = fclose(file); if (res != 0) { printf("\n*****파일이 정상적으로 닫히지 않았습니다.*****\n\n"); return 1; } else printf("\n*****파일이 정상적으로 닫혔습니다.*****\n\n"); // 결국 파일이 종료된다. 파일 닫기. return 0; } 엔터 입력마다 다른 현상의 오류가 납니다.
- 해결됨C 프로그래밍 - 입문부터 게임 개발까지
RE_질문 : 선생님~ 추가로 아래에 한분이 기재한 질문인 백스페이스 입력에대한 답 부탁드리면 안될까요??
선생님 무능력해서 죄송합니다........ 이것 말고는 도저히 모르겟어요.... 가르쳐주세요..... (배열 마지막 값을 어찌 삭제해야할지 도통 감이 안옵니다.... 머리가 장식이에요 ㅜㅠ) 그리고 선생님께서 가르쳐주신대로 printf("\b");를 넣었는데요. 백스페이스바를 입력하니까 "*" 이게 사라지진 않고, 그냥 데이터 입력하는 커서만 뒤로 이동하던데요.... 이렇게요... 아 선생님 그리고, 제가 일기를 쓸때는 한글입력이 한글자가 다 입력되고 다음글자를 입력할때야 전 글자가 표시가 되더라고요. 선생님처럼 한글이 입력하는 순간에 바로바로 표시가 안되요...... 왜그럴까요??ㅜㅠㅜㅠ 제발~~~못난 제자에게 가르침을 주십쇼 ㅠㅜㅠㅜ
- 미해결C 프로그래밍 - 입문부터 게임 개발까지
RE_질문 : 선생님~ 일기에 줄바꿈 문자를 넣고 싶을때는 어떻게해야될까요?
3번의 테스트 결과와 제가 쓴 코드입니다. 첫번째 테스트는 비밀번호는 '나도코딩'(물론 영문으로) 설정한 거구요. 두번째와 세번째 테스트는 제가 웹사이트에서 즐겨쓰는 비밀번호(13자리 문자로만) 설정한건데 마지막 테스트에서 보시듯이 쓰레기 문자가 저렇게 많이 출력됐습니다. (비밀번호 길이에 따라 달라질수도 있는건가요??) 분석 부탁드릴게요 ㅜㅠㅜㅠ. 그리고 정상적으로 줄바꿈(엔터)을 입력하려면 어떻게해야하는지 가르쳐주세요 ㅜㅠ
- 해결됨C 프로그래밍 - 입문부터 게임 개발까지
RE_질문 : 66줄의 getchar();에 대한 자세한 설명부탁드려요 선생님 ㅠㅠ
scanf에 줄서있는 '\n'을 대기시키도록 하지 않기 위해 getchar();를 입력한다는 선생님의 말씀을 알아들었습니다. 그런데 애초에 getchar(); 라는 건 문자열입력 함수잖아요? 가령 scanf("%s", ch); 를 쓸 것을, ch=getchar();라고 쓴다는 의미(정확한 것은 아니지만, 굳이 비유를 하자면요 ㅎㅎ)인 거 잖아요? 그런데 어떻게 getchar();가 초기화없이 쓰일수가 있고, getchar();에 대한 입력하는 프로그램이 등장하지 않고, 어떠한 원리로 scanf에 줄 서 있는 '\n'를 없앨 수가 있는거죠? 혹시 getchar();에 대해 제가 빼먹고 공부한 부분이 있는건지요? 저렇게 입력하는 것 이상은 아는바가 없어서요... 이에 대한 답변 부탁드립니다......
- 해결됨C 프로그래밍 - 입문부터 게임 개발까지
선생님~ 추가로 아래에 한분이 기재한 질문인 백스페이스 입력에대한 답 부탁드리면 안될까요??
입력한 데이터를 지우려면 어떻게 해야하는지 모르겠고.... 비밀번호를 입력해서 출력되는 "*" 요놈도 어떻게 지워야하는지도 영 감이 안잡힙니다...... 선생님께서 이 우메한 학생들에게 시원하게 가르쳐주세요 ㅜㅠㅜㅠ
- 미해결C 프로그래밍 - 입문부터 게임 개발까지
선생님~ 일기에 줄바꿈 문자를 넣고 싶을때는 어떻게해야될까요?
일기에 줄바꿈 문자를 넣고싶어서 enter를 누르면 쓰레기문자(?)가 수십번입력되고 파일이 저장되요.... 줄바꾸기만 하고 싶다면 어떻게 해야할까요?
- 해결됨C 프로그래밍 - 입문부터 게임 개발까지
66줄의 getchar();에 대한 자세한 설명부탁드려요 선생님 ㅠㅠ
getchar();는 문자를 입력하는 함수로 알고 있는데 그게 어떤 원리로 scanf에 입력한 줄바꿈문자를 flush 처리할 수 있는건지 자세한 설명 부탁드립니다ㅜㅠ 또, 이 프로젝트에서 그 문구가 있을때와 없을때의 차이는 뭔가요?
- 해결됨C 프로그래밍 - 입문부터 게임 개발까지
char line[max]는 어디서 쓰이게 되는건가요?
처음에 변수 선언만 하고, 쓰이는 곳이 없던데, 선언 후에는 프로그램 안에서 어디서 쓰이게 되는건가요?
- 미해결C 프로그래밍 - 입문부터 게임 개발까지
메모리 할당
안녕하세요 질문하고 싶은게 있습니다 소스코드 printf("%10s", "~~"); (물결은 그냥 넣었습니다) 에서 %10s 는 뒤에 들어갈 문자형에 10byte 만큼의 공간을 할당해준다는 뜻이 맞나요? 혹시 맞다면 printf(" ~~ "); 이런 식으로 써도 코드 자체에는 문제가 없는 것 같은데 단점 같은게 있을까요?(가독성이 떨어지는 것 같긴 합니다)
- 미해결C 프로그래밍 - 입문부터 게임 개발까지
타 c파일의 함수
해당 c파일 이외에 다른 c파일에서 만든 void 함수를 그대로 선언 없이 사용할 수 있나요?
- 미해결C 프로그래밍 - 입문부터 게임 개발까지
지정된 파일을 찾을 수 없다고 나옵니다.
HelloWorld를 코딩 한 후에 Ctrl + F5를 눌렀더니 그림과 같인 지정된 파일을 찾을 수 없다고 나옵니다. 코딩은 문제가 없어 보이는데 뭔가 설정에 문제가 있는 걸까요?
- 미해결C 프로그래밍 - 입문부터 게임 개발까지
clock()함수가 나왔는데요...
clock 함수에서 초를 구하는 개념이 잘 안잡힌것 같아요... 이해하기 쉽게 설명 해주실 수 있나요...?
- 미해결C 프로그래밍 - 입문부터 게임 개발까지
왜 오류가 뜨는지 모르겠어요 ㅠㅠ
(사진)
- 미해결C 프로그래밍 - 입문부터 게임 개발까지
마지막 디폴트에 break를 쓰는 이유가 뭔가요?
마지막 값은 break안써도 정상적인 처리 되지않나요?
- 미해결C 프로그래밍 - 입문부터 게임 개발까지
float 과 double이 사용되는 상황이 다른가요?
그냥 보기엔 둘다 비슷해보이는데 float 대신double을 쓸때와 double 대신 float을 써야하는 이유가있나요??
- 미해결C 프로그래밍 - 입문부터 게임 개발까지
%d 자체의 의미는 무엇인가요??
%d 자체의 의미는 무엇인가요??