묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨홍정모의 따라하며 배우는 C언어
버퍼에 관한 질문 (수정본)
Q1) A가 출력되지 않는 이유는? 영상 (02:40)에 나오듯이 scanf의 %c는 한 문자만 읽을 수 있음으로, "A 3 2"을 입력시, A만 호출되고 \n는 버퍼에 남겨지는 상태를 볼 수 있습니다. 그로 인하여, 다음 출력문으로 입력하였던 "B 1 2"대신에 (\n 3 2)가 먼저 출력되는 것을 확인할 수 있습니다. 여기서 우리는 실제 scanf(%c %d %d)버퍼에 입력된 값이 ('A', 3, 2, '\n')임을 알 수 있습니다. scanf(%c %d %d) ↔ ('A', 3, 2, '\n') 그래서 다음과 같은 테스트를 진행해보았습니다. 영상(02:40)와 달라진 점은 기존에 \n자리에 s가 들어가고, 바로 그 뒤에 '\n'이 붙는다는 점입니다. 즉, 현재 scanf(%c) 버퍼에는 'A', 's', '\n'가 들어가 있는 것이죠. 그렇다면 총 (A 3 2), (s 3 2), (\n 3 2)순으로 while문이 출력되어야 할 것이라는 것이 저의 예상이었습니다. 그러나 위 결과물처럼 'A'는 생략되고, 's'가 출력되는 것을 확인할 수 있습니다. 한편, 버퍼에 남아있던 '\n'는 잘 출력되는 것을 확인할 수 있습니다. ----------------------------------------------------------------------------------- 2) 영상 (05:10)의 오해. // 자문자답 (선생님의 코드와 동일합니다. "* 3 5 빈칸"을 입력하셔서 한 번 반복되신 것으로 확인됩니다. 아마 사람들은 빈칸을 못보고 지나간 다음에 스스로 테스트한 것과 달라서 의문이 생길 수 있으니 다음 분들은 참고해주세요!) 영상에 나온 코드로 "A 3 2"를 입력하면 while문은 종료하게 됩니다. 왜냐하면 while문의 조건이 (c = getchar()) != '\n')인데, 질문1처럼 'A'과 함께 '\n'도 같이 입력이 되니, while싸이클을 한 번 돌고, 다시 올라오면 '\n'와 만나서 반복되지 않고 프로그램은 종료되는 것을 확인할 수 있습니다. 영상에서 보여진대로, 이는 while문 중간에 while (getchar() != '\n') continue;를 넣어주면 해결할 수 있습니다. 그 이유는 A 3 2를 입력하였을 때, getchar함수로 인하여 char c 변수에 'A' 문자 데이터가 저장되고, 버퍼에 남아있던 \n가 두 번째while문에서 읽혀지고 해당 while문 영역에서 벗어나면서 사라지기 때문입니다. ----------------------------------------------------------------------------------- Q3) \n는 어디로?? 본래, 저의 질문입니다. getchar을 청소해주는 while문을 주석처리해놓고, "# 3 2 빈칸"과 "% 1 2"를 입력해보았습니다. 얼핏보면 당연한 결과물이라고 생각할수도 있으나, 질문2에서 확인했다시피 "# 3 2" 싸이클이 끝나면 해당 while문은 '빈칸 3 2'을 한번 더 돌리고, '\n'을 만나서 종료되어야 했습니다. 즉, '\n'의 다음 순서인 "% 1 2"는 실행되어서는 안됩니다. "# 3 2 빈칸"을 입력하는 순간, 버퍼에는 ['#', 3, 2, '빈칸' '\n']가 저장이 됩니다. 이는 while문은 총 (# 3 2), (빈칸 3 2) (\n 3 2)를 돌릴 수 있는 경우의 수를 가지게 됩니다. 이 때, (\n 3 2)는 while문 조건에 의하여 종료되고 실행되지는 않아야 합니다. ***디버깅 테스트: 1. "# 3 2"가 출력된다. 2. 두 번째 싸이클인 "빈칸 3 2"이 시작되면 scanf함수가 실행이 됩니다. 3. scanf함수에 입력한 "% 1 2"는 버퍼에 들어가게 됩니다. 위 이미지처럼 char c변수에는 getchar함수로 인하여 '#'부터 '빈칸', '\n', '%'순으로 문자를 하나씩 버퍼에서 꺼내옵니다. 그 와중에 \n은 어디에서 제거가 된 것인가요?
-
해결됨홍정모의 따라하며 배우는 C언어
질문) m1n_q님의 질문의 답변, 이해했는지 확인하고 싶어요.
안녕하세요. C언어는 질문도 상당히 많고, 길기도 하네요.. 질문드리기가 정말 실례되네요 ㅋㅋ... 저의 뇌피셜..;;이지만 제가 이해한 게 맞는지 확인하고 싶어요..ㅠ 처음에 while((c = getchar()) != '\n') 부분에서 " * 공백/3 공백 5 공백 "을 받은 것이 중요한 포인트입니다. 여기서 차곡차곡 순서대로 쌓인 버퍼에서 3과 5 앞의 공백은 각각 L-value 변수들을 구분하기 위한 공백입니다. 따라서 char의 버퍼에는 '*', 'space', '\n'가 들어가게 됩니다. 결과적으로 while은 총 (* 3 5), (space 3 5), (\n 3 5). 세 가지의 경우의 수를 갖게 됩니다. 아래 주석1) 이 설명에 잘못된 점이 하나 있습니다. 처음에 char버퍼에 *과 space와 \n가 있다고 했는데, 그렇다면 (%, 2, 2)가 출력되지 전에, \n를 만나서 while문이 실행되지 않아야 합니다.. \n가 중간에 어디선가에서 제거가 되는 것인데.. 또는 제가 완전히 잘못 이해했던 것일거에요 ㅋㅋ...(허탈) ------------------------------------------------------ 주석1) joy님 말씀대로라면 "두번째로 scanf가 실행되게 되었는데 버퍼엔 \n 만 남아있게되므로 scanf 에서 가져올게 없는 상태입니다. 근데 이때 \n는 버퍼에서 비워집니다." 이 때문에 sp, 3, 5에서 scanf를 호출할 때, \n는 사라지고 (%, 2, 2 + '\n')가 들어가니 %, 2, 2가 끝나고 while에서 \n를 만나게 되는 것 같습니다.
-
미해결홍정모의 따라하며 배우는 C언어
배열크기 선언시 const int 로 된 값을 넣으면 안되나요?
안녕하세요. 혼자 다른 배열 예제를 풀어보다가 좀 이상한게 보여서 여쭙게 되었습니다. 이런식으로 코드 작성시 int a[10] 대신에, num을 10으로 고정시키고, int a[num]으로 선언을 해보았습니다. 그랬더니, 배열 a의 사이즈를 알 수 없다 라고 에러가 떳습니다. 그런데 조금 다르게 define 으로 넣어줘봤더니 에러가 사라지고 아무 문제없습니다. 뭐가 다른지 잘 모르겠습니다. const 로 할 때는 왜 안되는 건가요? (int a[num]에 대해 'a': unknown size라고 뜹니다.) *질문 답변 뒤에 괜히 인사말 남기면 또 알람이 가서 귀찮으실까 감사인사말 안달고 있는데, 정말 감사히 배우고 있습니다. 감사하다는 말씀 꼭 드리고 싶습니다.
-
미해결C 프로그래밍 - 입문부터 게임 개발까지
코딩오류 질문
안녕하세요.. 코딩을 마치고 확인해보니 비밀번호(asd)가 계속 틀린 것으로만 나와서 어떻게 수정하면 좋을지 질문 드립니다. ㅠㅠ.. #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> //비밀번호를 입력받는다 //맞는 경우 -> 비밀 일기를 읽어와서 보여주고 계속 작성하도록 한다. //틀린 경우 -> 경고 메시지를 표시하고 종료한다. #define MAX 10000 int main(void) { //fgets, fputs 활용 char line[MAX]; //파일에서 불러올 내용을 저장할 변수 char contents[MAX];//일기장에 입력할 내용 char password[20]; //비밀번호 입력 char c; //비밀번호 입력 시 키값을 *처럼 보이도록 하기위해 사용 (마스킹) printf("*****비밀일기장*****\n"); printf("비밀번호 : "); while (1) { c = getch(); //getchar()와 getch() 차이 : //getchar() -> 엔터를 입력받아야 동작합니다. //getch() -> 키 입력시 바로 동작합니다. int i = 0; if (c == 13) //Enter를 나타내는 아스키 코드 --> 비밀번호 입력 종료 { password[i] = '\0';//문자열의 끝을 나타내는 코드 break; } else //비밀번호 입력 중 { printf("*"); //입력시 *표시 password[i] = c; //입력된 문자는 password[i]에 저장 } i++; } //비밀번호 : asd printf("\n\n...비밀번호 확인중...\n\n"); if (strcmp(password, "asd") == 0) //password == "asd" --> 문자열 비교 불가 strcmp(비교대상, "문자")로 해야 함 --> 같다면 0 { printf("비밀번호 확인 완료!\n"); char* fileName = "C:\\Users\\SJ\\Desktop\\test1.txt"; FILE* file = fopen(fileName, "a+b"); //a+b --> 파일이 없으면 생성, 있으면 append (뒤에 내용 이어 씀) if (file == NULL) { printf("파일 열기 실패\n"); return 1; } while (fgets(line, MAX, file) != NULL) { printf("%s", line); } printf("\n\n 내용을 계속 작성하세요. 종료하려면 EXIT를 입력하세요.\n"); while (1) { scanf("%[^\n]", &contents); //우리는 문자 전체를 모두 입력해야 하기 때문에 줄바꿈(\n)이 나오기 전까지 읽어라 --> 한 문장씩 저장하겠다. getchar(); //Enter 입력시 (\n)을 Flush처리 -> upper에 남아있던 \n를 없앰 if (strcmp(contents, "EXIT") == 0) { printf("비밀일기 입력을 종료합니다.\n\n"); break; } fputs(contents, file); fputs("\n", file); // \n를 위에서 getchar()로 무시했으므로 임의로 추가함. } fclose(file); } else //비밀번호 틀림 { printf("=== 비밀번호가 틀렸어요! ===\n\n"); printf("당신 누구야! 일기를 엿보는 것은 나빠요\n"); } return 0; }
-
미해결홍정모의 따라하며 배우는 C언어
4.9강 printf() int 변수에 관해 질문 올립니다.
안녕하세요. 먼저 선생님 양과 질적으로 훌륭한 강의 잘 보고 있습니다. 항상 감사드립니다. 64bit에서는 데이터의 사이즈가 안 맞아도 int 변수의 위치와 형식지정자만 맞으면 1024가 출력이 되는데 이유를 알 수 있을까요? 아래 강의를 보고 따라한 저의 코드입니다. #include <stdio.h> int main() { float n1 = 3.14f; // 4 bytes double n2 = 1.234; // 8 bytes int n3 = 1024; // 4 bytes printf("%f %f %d \n", n1, n2, n3); //Note the warings in output window printf("%d %d %d \n", n1, n2, n3); // 4, 4, 4 (N, N, N) printf("%lld %lld %d\n", n1, n2, n3); // 8, 8, 4 (N, N, Y) printf("%f %d %d\n", n1, n2, n3); // 8, 4, 4 (Y, N, N) printf("%f %lld %d\n", n1, n2, n3); // 8, 8, 4 (Y, N, Y) return 0; }
-
해결됨C 프로그래밍 - 입문부터 게임 개발까지
7-7에 질문이 있습니다
안녕하십니까! 강의를 듣다가 궁금한 사항이 생겨서 질문을 드립니다 int arr2[3] = { 10, 20, 30}; //changeArray(arr2); changeArray(&arr2[0]); 여기서 &arr2[0] 자리에 &arr[2] 을 넣아야지 30이 50으로 바뀌는 것 아닌가요 ? 왜 &arr2[0]을 넣어서 값이 50이 나오는지 이해가 잘 되지 않네요 ㅠㅠ
-
미해결홍정모의 따라하며 배우는 C언어
signed int의 오버플로우 질문입니다
8비트를 예를 들어 8비트의 최댓값이 127이므로 +1을 하면 1000/0000이 되야하는데 부호가있는 8비트 정수에서는 앞이 1이면 안되지 않나요? 근데 컴파일해보니 1000/0000이렇게 뜨는데 이건 부호가있는 정수에서는 -128아닌가요? 헷갈립니다( 32비트를 8비트로 줄여서 말씀드립니다)
-
미해결홍정모의 따라하며 배우는 C언어
Printf 함수질문
공부하다가 잠시 의문점을 갖게 된 부분이있습니다,, 구글링을 해봐도 못찾아서 도움을 받으려고 왔습니다 Printf함수에 대해 질문하고싶은데 저가 보는 책(이것이 c언어다)에서, Printf함수가 기본적으로 문자열을 출력하는 함수이고, 정수와 실수를 printf함수로 출력하려면 실제 아스키코드값형태의 문자로 변환시켜야 출력이 가능하고 그래서 정수나 실수를 printf로 찍을때는 변환문자가 필요하고 이 변환 문자를 사용하라고 나와있습니다 Int a=10; Printf(“%d”,a); 하면 원래 a의 대이터 10은 이진수로 00000000 00000000 00000000 00001010 이렇게 저장되있는데 이러한 이진수가 printf (“%d”)로 출력하면 1번째 질문 %d때문에 아스키코드로 변환하는 과정이 나온다음 문자인10이 화면에 출력된다는건가요? 즉 아스키코드가 ‘0’이 48이고 ‘1’이 49인데 메모리에 저장된 이진수들이 %d로 인해서 아스키코드로 변환하는 과정을 거치고 그과정의 결과가 49 48로 나와서 문자열 10이 나오는건가요?? 저가 이해한게 맞나요? ㅠㅠ
-
미해결홍정모의 따라하며 배우는 C언어
*count++ 에서 precedence 질문
후위증가연산자 ++가 우선순위가 더 높아서 *start++ 가 *(start++)와 동일하다는 것은 알겠습니다. 하지만 이런식이라면 count라는 포인터변수에 ++ 라는 포인터 산술연산을 하고 dereferencing을 한다는 말인데 이것이 후위연산자라서 마치 dereferencing을 먼저하고 그 다음 더하는 것 같아서 헷갈립니다. Operator precedence in C 를 보면 후위연산자가 제일 순위가 높던데 후위연산자를 보면 우선순위에 맞게 괄호를 넣은 것처럼 보면서 계산하고 계산이 모두 끝난 뒤 후위연산자를 적용하는 방식으로 바라보아야 하나요? 우선순위는 제일 높은데 정작 계산은 제일 나중에 되니 이해가 잘 안되네요.
-
미해결홍정모의 따라하며 배우는 C언어
질문입니다
while문에 getchar() 대신 c를 넣으면 실행이 안되는 이유가 무엇인가요? int c = getchar(); 로 선언을 했기 때문에 if문의 조건 부분 처럼 getchar() 부분을 c로 바꾸었더니 실행이 안되네요.
-
미해결혼자 공부하는 C 언어 저자에게 배우는 C 언어의 모든 것
질문
아직 질문받나요?
-
미해결홍정모의 따라하며 배우는 C언어
질문드립니다.
char words[MAXLENGTH] = "A string in an array"; const char* pt1 = "A pointer to a string."; // point the first address of sentence puts("Puts() adds a newline at the end: "); // puts() add \n at the end puts(MESSAGE); puts(words); // char words[21] removes this warning -> Total 81 sizes but, only 21 sizes are initialized puts(pt1); words[3] = 'p'; // OK puts(words); //pt1[8] = 'A'; // Runtime Error 건들이면 안되는 부분임 puts(pt1); char greeting[50] = "Hello, and" " How are" " you" " today!"; //아래 코드와 같음. //char greeting[50] = "Hello, and How are you today!"; puts(greeting); printf("%s, %p, %c\n", "We", "are", *"excellent programmers"); char cookies[1] = { 'A', }; //char cookies[1] = {'A'}; 도 같은 결과가 나옴 puts(cookies); 위 코드를 실행해보니 이렇게 출력되더라고요 그리고 puts(cookies); 에 초록색 밑줄로 String 'cookies' might not be zero-terminated. 라고 나옵니다. 어디서 문제가 발생한건지, Hello, and How are you today! 는 왜 한번 더 출력된건지 궁금합니다.
-
미해결홍정모의 따라하며 배우는 C언어
int[2]의 의미
정확한 의미가 잘 와닿지 않아서 질문드립니다 (int[2]) { 1, 2 }에서 int[2]의 의미는 int타입의 어떤 값 2개로 된, 이름 없는 리터럴을 원소로 하는 배열을 의미하는 것인데 결국 (int[2]) { 1, 2 }는 초기화되지 않은 쓰레기값 2개와 { 1, 2 } 즉 (쓰레기값1, 쓰레기값2) { 1, 2 } 이렇게 각각 4개의 리터럴과 2개의 복합리터럴로 구성된 것이라 이해하면 될까요?
-
미해결C 와 C++ 을 동시에 배워보자 - 두들낙서의 C/C++
1번 문제 관련 질의
지금까지 배운 내용을 토대로 해서 1번 문제를 정수 크기 순서대로 산출하는 것도 가능할까요? 예를 들면 1번 예시의 입력값에 대해 1 1 9 2 3 4 5 형태로 출력하게
-
해결됨홍정모의 따라하며 배우는 C언어
build solution 단축키
빌드솔루션 단축키가 영상에선 f7인데 저는 strl+shift+B 네요. 보통 프로그램들이 단축키는 잘 안바꾸는편인데 VS는 바꼈나봐요? 불편..불쾌.. 아래질문하신분처럼 빌드에러도 뜨고요. ;;;
-
미해결홍정모의 따라하며 배우는 C언어
8.5 2분
2분 경에 나오는 코드 관련해서 질문이 있습니다!! 교수님께서 입력하시는 걸 따라해보면서 디버깅을 해봤는데 이해가 가지 않는 부분이 있습니다 우선 제가 어떻게 이해했는지 한번 적어볼게요!! 읽어보시고 틀린 부분 있으면 지적해주세요!! (편의상 띄어쓰기는 (sp)라고 표기하겠습니다) 우선 scanf함수가 실행되어야 하는데 버퍼에 아무것도 없어서 사용자로부터 입력을 받습니다. 여기서 'a(sp)3(sp)3(sp)\n'을 입력하면 c, rows, cols에 a, 3, 3이 들어가게 되고 display 함수가 실행되어 a가 9개(3x3)이 출력됩니다.(앞에 있는 두개의 sp는 구분하는 기호로써 사용됨) 그 다음 if문을 지나게 되는데 c는 'a'이므로 조건에 부합하지 않아 무시하고 넘어갑니다. 다시 while문의 처음으로 돌아가서 scanf가 실행되어야 하는데 버퍼에 남아있는 게 '(sp)\n'밖에 없어 읽어들일 수 있는 정수형이 없기 때문에 사용자로부터 'b(sp)1(sp)2\n' 라고 입력받습니다.( Q1. 이 부분은 제가 추측한건데 이런 이유때문에 입력 받는 거 맞나요?? ) 그 후에 c는 '(sp)', rows는 3, cols는 3인 상태로 display함수를 통해 (sp)를 9개(3x3) 출력합니다. Q2. 여기서 궁금한 게 있습니다!! 'b(sp)1(sp)2\n'라고 입력 받았는데 왜 rows랑 cols는 여전히 처음 받은 입력값 그대로인 건가요? display(sp, 3, 3)가 실행되고 난 후 if문을 지나서 다시 while문의 처음으로 돌아갑니다. Q3. 현재 버퍼에는 '\nb(sp)1(sp)2\n'이렇게 남아있는데 디버깅을 해보니까 c에는 b가, rows에는 1, cols에는 2가 들어가더라구요.. 왜 c에 \n이 들어가는 게 아니라 b가 들어가는거죠? b를 2개(1x2) 출력하고 난 후 다시 if문을 거쳐 scanf로 돌아갑니다. 그런데 읽어들일 정수형이 버퍼에 없어 사용자로부터 'c(sp)2(sp)1\n'을 입력받습니다. (여기는 교수님께서 입력 안하셨길래 제가 임의로 입력했습니다) 현재 버퍼에는 '\nc(sp)2(sp)1\n'이 있어서 c에는 \n, rows에는 2, cols에는 1이 들어가게 됩니다. display(\n , 2, 1)이 실행되어 \n이 4개 출력되고, if문을 만족시켜서 while문을 탈출하게 되고 프로그램이 종료됩니다. 여기까지가 제가 이해한 내용이고 중간에 틀린 부분 있으면 지적해주세요!! c언어는 포인터가 어렵다고 들었는데 왜 저는 버퍼랑 입력함수에서 헤매고 있을까요..ㅠㅠ
-
미해결C 프로그래밍 - 입문부터 게임 개발까지
printf("%d₩n",age)에서의 ₩n 의미
₩n의 의미를 모르겠습니다!
-
미해결홍정모의 따라하며 배우는 C언어
컴파일 오류?
4:55 gcc main.c를 치면 에러가 나요 C:/Program Files (x86)/mingw-w64/i686-8.1.0-posix-dwarf-rt_v6-rev0/mingw32/bin/../lib/gcc/i686-w64-mingw32/8.1.0/../../../../i686-w64-mingw32/lib/../lib/libmingw32.a(lib32_libmingw32_a-crt0_c.o):crt0_c.c:(.text.startup+0x39): undefined reference to `WinMain@16' collect2.exe: error: ld returned 1 exit status
-
해결됨홍정모의 따라하며 배우는 C언어
형식지정자 크기와 자료형에 대한 질문입니다.
#include <stdio.h> #include <limits.h> #include <stdlib.h> int main() { char c = 65; short s = 200; unsigned int ui = 3000000000U; long l = 65537L; long long ll = 12345678908642LL; printf("char = %hhd, %d, %c, %ld, %lld\n", c, c, c, c, c); // 왜 %lld 만 수가 다르게 나오나요? 분명 더 큰 형식지정자인데 궁금합니다. printf("short = %hhd, %hd, %d, %ld, %lld\n", s, s, s, s, s); printf("unsigned int = %u, %d\n",ui,ui); printf("long = %ld, %hd, %lld\n", l, l, l); printf("long long = %lld, %ld\n",ll,ll); return 0; } 질문: 더 큰 형식지정자인 %lld 를 사용해서 char 자료형을 출력했는데 다른 형식지정자들은 65로 같게 나오는데 %lld 만 다르게 출력됩니다. 무슨 이유가 있나요?
-
미해결홍정모의 따라하며 배우는 C언어
while (scanf(
안녕하세요. 스트링 입력을 받는 아래 코드에서 while (scanf("%[^\n]%*c", input) != 1) printf("Please try again.\n>> "); 아무것도 입력하지 않고 엔터키를 누르면 Please try again>> 이 구문이 무한 반복으로 나타납니다. 왜 이런 걸까요?