본문

[질문] C에서 함수의 발동(?)시점과 조건

일시 추천 조회 729 댓글수 17


1

댓글 17

프로그램 키자마자 인거 같습니다

모리노요루 | (IP보기클릭)58.126.***.*** | 22.01.08 22:11
모리노요루

추가로 달자면 c는 항상 위에서 아래로 내려갑니다 printf 가 나왔다는건 위 while 문이 다 실행되고 나서예요.

모리노요루 | (IP보기클릭)58.126.***.*** | 22.01.08 22:14

K++을 하고 K가 10보다 작으면 K가 다시 0이되고 ++ 해봤자 다시 초기화 됩니다. 비교후 다른변수값으로 치환을 하는게 맞을거 같은데 정확히 뭘구현하려는지 알수가 없어서 답변은 이정도로 합니다.문자열을 받는건지;; 한글자를 어떻게 하려는건지;

madcat_mk2 | (IP보기클릭)1.236.***.*** | 22.01.08 22:12
madcat_mk2

문자열 2개를 만들어서 기준 이하의 것은 버리고 기준 이상의 것만 저장하고 출력하려고 했는데 안되는거 하나씩 지우다 보니 결국 저기까지 왔네요. 답변 감사드립니다.

인민배우 심영 | (IP보기클릭)59.16.***.*** | 22.01.08 22:32

이상한 부분: 1) void main <--> return 0 // void는 return이 없음. int로 변경 2) if k<10 k<=0 // 한줄씩 따라가보시면 k++ 직후에 0으로 초기화해서 사실상 무한루프 3) 들여쓰기 규칙을 지켜봄 직. 4) 코드가 의도와 맞지 않음. getchar 예제를 구해서 한줄씩 따라가본 뒤, 의도대로 하나씩 수정해보는 접근이 좋을 듯

BlackAn | (IP보기클릭)121.134.***.*** | 22.01.08 22:28
BlackAn

답변 감사드립니다. 예제를 더 파봐야 겠네요

인민배우 심영 | (IP보기클릭)59.16.***.*** | 22.01.08 22:31
인민배우 심영

#include <stdio.h> #include <string.h> int main(){ char c; while((c=getchar())!=EOF){ printf("%c,", c); } return 0; } 이걸로 시작해보시는 것도 좋겠네요.

BlackAn | (IP보기클릭)121.134.***.*** | 22.01.08 22:35

코드에 여러가지 부분이 문제있을수도 있습니다. 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) 하실때 문제가 생길수 있습니다.

프미곰 | (IP보기클릭)141.164.***.*** | 22.01.08 22:36
프미곰

IDE 사용중이시면 디버그모드로 라인 바이 라인 디버깅해보시는걸 꼭 추천드립니다. 프로그래밍 실력향상에 많은 도움 되실겁니다. 리눅스 환경에서 컴파일하시는거면 gdb를 사용하시면 좋습니다.

프미곰 | (IP보기클릭)141.164.***.*** | 22.01.08 22:40
프미곰

getchar발동 시점을 말씀드리면 프로그램이 위 라인부터 실행되고 getchar라인으로 가면 실행됩니다. getchar 함수가 콜되면, stdin 버퍼에서 입력이 있을때까지 대기합니다. stdin 버퍼에 어떤 입력이 있으면 다음라인이 실행됩니다. getchar은 버퍼에서 1바이트씩 입력을 받기 때문에 입력했던 문자열 길이 + 1 (다음라인문자열) 만큼 돌게되어있습니다.

프미곰 | (IP보기클릭)141.164.***.*** | 22.01.08 22:47
프미곰

아. main도 함수이기 때문에 꼭 리턴을 해주는게 좋다라고 만 알고 있었는데 void랑 같이 하면 오히려 않좋군요. void를 int로 바꾸던지 아니면 리턴을 빼던지...까다롭기가 무슨 며느리 장맛보는 시어머니 수준이네요.. 답변 감사드립니다.

인민배우 심영 | (IP보기클릭)59.16.***.*** | 22.01.08 22:49

"일정 갯수 이하의 문자는 출력하지 않는 코드"를 구현하시려면, 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;

편안한 집 | (IP보기클릭)59.12.***.*** | 22.01.08 22:41
편안한 집

감사드립니다. 다시한번 해봐야 겠네요.

인민배우 심영 | (IP보기클릭)59.16.***.*** | 22.01.08 22:50

while은 그냥 무한 돌리고 그 안에서 c 값이 eof일 때 break 시키는게 맞을 것 같네요. while문이 c값을 체크하는게 아니라 함수의 결과를 eof와 체크하는 것 같네요. while문에서 if문은 잘 수행됩니다.

루리웹-3872261902 | (IP보기클릭)1.235.***.*** | 22.01.08 22:44
루리웹-3872261902

void는 return값 필요없습니다. 그리고 오버플로우를 예방하려면 k값 초과도 break 시키는게 좋겠네요

루리웹-3872261902 | (IP보기클릭)1.235.***.*** | 22.01.08 22:47
루리웹-3872261902

감사드립니다. 몇 줄 안되는 코드라고 제가 너무 안이하게 접근했네요

인민배우 심영 | (IP보기클릭)59.16.***.*** | 22.01.08 22:51

발동 시점이라 하니까 유희왕 같네요

오잇스 | (IP보기클릭)210.107.***.*** | 22.02.18 10:19
댓글 17
1
위로가기
세가좋어 | 추천 0 | 조회 295 | 날짜 2024.04.12
공돌이인생 | 추천 0 | 조회 105 | 날짜 2024.03.29
루리웹-1970043849 | 추천 0 | 조회 208 | 날짜 2023.12.18
질풍비장의패 | 추천 1 | 조회 589 | 날짜 2022.11.30
루리웹-3648796984 | 추천 0 | 조회 781 | 날짜 2022.11.23
루리웹-8641268934 | 추천 2 | 조회 702 | 날짜 2022.08.07
루리웹-4247021526 | 추천 2 | 조회 747 | 날짜 2022.07.25
루리웹-4746138650 | 추천 0 | 조회 680 | 날짜 2022.06.01
키라 요시카게 | 추천 1 | 조회 738 | 날짜 2022.05.24
우너무너 | 추천 0 | 조회 663 | 날짜 2022.05.14
키라 요시카게 | 추천 0 | 조회 652 | 날짜 2022.04.03
와이플 | 추천 0 | 조회 652 | 날짜 2022.01.14
와이플 | 추천 0 | 조회 677 | 날짜 2022.01.13
와이플 | 추천 1 | 조회 823 | 날짜 2022.01.13
인민배우 심영 | 추천 0 | 조회 879 | 날짜 2022.01.09
인민배우 심영 | 추천 0 | 조회 729 | 날짜 2022.01.08
오잇스 | 추천 0 | 조회 647 | 날짜 2022.01.05
인민배우 심영 | 추천 0 | 조회 541 | 날짜 2022.01.02
인민배우 심영 | 추천 0 | 조회 663 | 날짜 2021.12.31
인민배우 심영 | 추천 0 | 조회 1034 | 날짜 2021.12.30
인민배우 심영 | 추천 1 | 조회 655 | 날짜 2021.12.27
salvare545 | 추천 0 | 조회 613 | 날짜 2021.12.27
_ 식봉이는 식봉해 | 추천 4 | 조회 1175 | 날짜 2021.12.27
인민배우 심영 | 추천 0 | 조회 702 | 날짜 2021.12.25
인민배우 심영 | 추천 1 | 조회 812 | 날짜 2021.12.24
인민배우 심영 | 추천 0 | 조회 919 | 날짜 2021.12.16
V1046R-MAHORO | 추천 1 | 조회 510 | 날짜 2021.12.14
인민배우 심영 | 추천 0 | 조회 713 | 날짜 2021.12.10

1 2 3

글쓰기
게시판 매니저