이상한 부분:
1) void main <--> return 0 // void는 return이 없음. int로 변경
2) if k<10 k<=0 // 한줄씩 따라가보시면 k++ 직후에 0으로 초기화해서 사실상 무한루프
3) 들여쓰기 규칙을 지켜봄 직.
4) 코드가 의도와 맞지 않음.
getchar 예제를 구해서 한줄씩 따라가본 뒤, 의도대로 하나씩 수정해보는 접근이 좋을 듯
코드에 여러가지 부분이 문제있을수도 있습니다.
1. void 리턴값의 함수에서 return 0; 는 하시면 안됩니다. (컴파일링은 될수 있어도 위험한 프로그램이 될수 있습니다)
2. k++; if (k<10) { k=0;} 을 하시면 k값이 0으로 고정되게 됩니다. 즉 s[0]에 c값을 계속 overwrite하시고 있습니다.
3. c=getchar() 에서 터미널에서 인풋을 하면 c가 EOF로 세팅이 안되서 무한루프에 빠질수도 있습니다.
https://www.cplusplus.com/reference/cstdio/getchar/ 여기를 참조하시면 EOF가 세팅된 스텐다드인풋이나 에러가 날때만 EOF가 세팅되게된다고 합니다.
4. 인풋이 여러번있을시에 s[1000] 버퍼를 재사용하시면 null character 값이 제대로 세팅이 되지 않아 printf("%s", s) 하실때 문제가 생길수 있습니다.
getchar발동 시점을 말씀드리면
프로그램이 위 라인부터 실행되고 getchar라인으로 가면 실행됩니다.
getchar 함수가 콜되면, stdin 버퍼에서 입력이 있을때까지 대기합니다.
stdin 버퍼에 어떤 입력이 있으면 다음라인이 실행됩니다.
getchar은 버퍼에서 1바이트씩 입력을 받기 때문에 입력했던 문자열 길이 + 1 (다음라인문자열) 만큼 돌게되어있습니다.
"일정 갯수 이하의 문자는 출력하지 않는 코드"를 구현하시려면, if문을 while문 안에 넣는게 아니라 출력문에 넣으셔야 합니다.
if (k>= 10) { print(%s\n%d", s, k); }
이런 식으로, 받은 문자 수 (k) 가 10을 넘어야 문자를 출력하도록 하면 됩니다.
추가로, 첫 번째 코드의 if문 조건은 k >= 10 이 아니라 k < 10으로 되어 있으므로, 10이 넘었을 때 0으로 초기화되는 코드가 아니라 적으면 초기화되는 코드입니다. 시작이 0이므로, 위 코드는 항상 k = 0으로 초기화되는 중입니다.
getchar는 while문의 조건 안에 들어가 있는데, while문의 조건은 while문 진입 시에 항상 처리됩니다.
첫번째 스크린샷의 코드는 다음과 같은 과정을 거칩니다.
1. 각종 변수 초기화 (c=0. k=0. n=0)
2. while문 진입, 조건 체크 ->
2-1. c=getchar();
2-2. c == EOF? 아니므로 다음으로
3. while문 body 실행(s[k]=c; k++; if(k<10){k=0}
4. 2번으로 되돌아감. while문 조건 체크 ->
4-1. c=gechar();
4-2. c == EOF? EOF 받았으면 while문 탈출
5. print(~~~)
6. return 0;
프로그램 키자마자 인거 같습니다
추가로 달자면 c는 항상 위에서 아래로 내려갑니다 printf 가 나왔다는건 위 while 문이 다 실행되고 나서예요.
K++을 하고 K가 10보다 작으면 K가 다시 0이되고 ++ 해봤자 다시 초기화 됩니다. 비교후 다른변수값으로 치환을 하는게 맞을거 같은데 정확히 뭘구현하려는지 알수가 없어서 답변은 이정도로 합니다.문자열을 받는건지;; 한글자를 어떻게 하려는건지;
문자열 2개를 만들어서 기준 이하의 것은 버리고 기준 이상의 것만 저장하고 출력하려고 했는데 안되는거 하나씩 지우다 보니 결국 저기까지 왔네요. 답변 감사드립니다.
이상한 부분: 1) void main <--> return 0 // void는 return이 없음. int로 변경 2) if k<10 k<=0 // 한줄씩 따라가보시면 k++ 직후에 0으로 초기화해서 사실상 무한루프 3) 들여쓰기 규칙을 지켜봄 직. 4) 코드가 의도와 맞지 않음. getchar 예제를 구해서 한줄씩 따라가본 뒤, 의도대로 하나씩 수정해보는 접근이 좋을 듯
답변 감사드립니다. 예제를 더 파봐야 겠네요
#include <stdio.h> #include <string.h> int main(){ char c; while((c=getchar())!=EOF){ printf("%c,", c); } return 0; } 이걸로 시작해보시는 것도 좋겠네요.
코드에 여러가지 부분이 문제있을수도 있습니다. 1. void 리턴값의 함수에서 return 0; 는 하시면 안됩니다. (컴파일링은 될수 있어도 위험한 프로그램이 될수 있습니다) 2. k++; if (k<10) { k=0;} 을 하시면 k값이 0으로 고정되게 됩니다. 즉 s[0]에 c값을 계속 overwrite하시고 있습니다. 3. c=getchar() 에서 터미널에서 인풋을 하면 c가 EOF로 세팅이 안되서 무한루프에 빠질수도 있습니다. https://www.cplusplus.com/reference/cstdio/getchar/ 여기를 참조하시면 EOF가 세팅된 스텐다드인풋이나 에러가 날때만 EOF가 세팅되게된다고 합니다. 4. 인풋이 여러번있을시에 s[1000] 버퍼를 재사용하시면 null character 값이 제대로 세팅이 되지 않아 printf("%s", s) 하실때 문제가 생길수 있습니다.
IDE 사용중이시면 디버그모드로 라인 바이 라인 디버깅해보시는걸 꼭 추천드립니다. 프로그래밍 실력향상에 많은 도움 되실겁니다. 리눅스 환경에서 컴파일하시는거면 gdb를 사용하시면 좋습니다.
getchar발동 시점을 말씀드리면 프로그램이 위 라인부터 실행되고 getchar라인으로 가면 실행됩니다. getchar 함수가 콜되면, stdin 버퍼에서 입력이 있을때까지 대기합니다. stdin 버퍼에 어떤 입력이 있으면 다음라인이 실행됩니다. getchar은 버퍼에서 1바이트씩 입력을 받기 때문에 입력했던 문자열 길이 + 1 (다음라인문자열) 만큼 돌게되어있습니다.
아. main도 함수이기 때문에 꼭 리턴을 해주는게 좋다라고 만 알고 있었는데 void랑 같이 하면 오히려 않좋군요. void를 int로 바꾸던지 아니면 리턴을 빼던지...까다롭기가 무슨 며느리 장맛보는 시어머니 수준이네요.. 답변 감사드립니다.
"일정 갯수 이하의 문자는 출력하지 않는 코드"를 구현하시려면, if문을 while문 안에 넣는게 아니라 출력문에 넣으셔야 합니다. if (k>= 10) { print(%s\n%d", s, k); } 이런 식으로, 받은 문자 수 (k) 가 10을 넘어야 문자를 출력하도록 하면 됩니다. 추가로, 첫 번째 코드의 if문 조건은 k >= 10 이 아니라 k < 10으로 되어 있으므로, 10이 넘었을 때 0으로 초기화되는 코드가 아니라 적으면 초기화되는 코드입니다. 시작이 0이므로, 위 코드는 항상 k = 0으로 초기화되는 중입니다. getchar는 while문의 조건 안에 들어가 있는데, while문의 조건은 while문 진입 시에 항상 처리됩니다. 첫번째 스크린샷의 코드는 다음과 같은 과정을 거칩니다. 1. 각종 변수 초기화 (c=0. k=0. n=0) 2. while문 진입, 조건 체크 -> 2-1. c=getchar(); 2-2. c == EOF? 아니므로 다음으로 3. while문 body 실행(s[k]=c; k++; if(k<10){k=0} 4. 2번으로 되돌아감. while문 조건 체크 -> 4-1. c=gechar(); 4-2. c == EOF? EOF 받았으면 while문 탈출 5. print(~~~) 6. return 0;
감사드립니다. 다시한번 해봐야 겠네요.
while은 그냥 무한 돌리고 그 안에서 c 값이 eof일 때 break 시키는게 맞을 것 같네요. while문이 c값을 체크하는게 아니라 함수의 결과를 eof와 체크하는 것 같네요. while문에서 if문은 잘 수행됩니다.
void는 return값 필요없습니다. 그리고 오버플로우를 예방하려면 k값 초과도 break 시키는게 좋겠네요
감사드립니다. 몇 줄 안되는 코드라고 제가 너무 안이하게 접근했네요
발동 시점이라 하니까 유희왕 같네요