문자열 강의 사용자 함수 s_gets 관련

cjh010322 Reply 4 years 22 weeks ago
#include <stdio.h> #include <string.h> #define SIZE 10 char* s_gets(char* st, int n) { char* ret_val; int i = 0; ret_val = fgets(st, n, stdin); if (ret_val) { while (st[i] != '\n' && st[i] != '\0') i++; if (st[i] == '\n') st[i] = '\0'; else while (getchar() != '\n'); } return ret_val; } int main() { char input[SIZE]; puts("INPUT ANYTHIN"); while (s_gets(input, SIZE)) puts(input); puts("THIS IS THE END OF THE PROGRAM"); } s_gets 함수는 예제들에 있던 함수인 것 같습니다. 입력에 아무 것도 넣지 않은 채로 엔터 키 하나만 누르면 input의 배열에 '\0'만 들어가므로 while(s_gets(input, SIZE))에서 false로 처리되어 break되어야 하는 것이 아닌가요? 프로그램 실행하면 while문이 계속 돌아가던데 왜 그런 것인가요?
withcs2 Reply 4 years 22 weeks ago
C언어는 다른 언어들과는 달리 boolean이라는 자료형이 따로 없습니다. 대신 0을 거짓, 0이 아닌 건 참으로 판단합니다. while(1)이 무한루프인 것도 그것 때문이에요 문자열과 문자의 차이에 대해 주의해주시면 좋을 것 같아요 아래 코드를 실행해서 여러 케이스를 넣어보면 이해하시는 데 도움이 될 것 같습니다 (터미널에서 EOF 입력은 ctrl+D입니다.) #include <stdio.h> #include <string.h> #define SIZE 10 char* s_gets(char* st, int n) { char* ret_val; int i = 0; ret_val = fgets(st, n, stdin); if (ret_val) { while (st[i] != '\n' && st[i] != '\0') i++; if (st[i] == '\n') st[i] = '\0'; else while (getchar() != '\n'); }else printf("if(\"%s\")가 실행되지 않았습니다.\n",ret_val); return ret_val; } int main() { if("\n")puts("if(\"\\n\")은 실행됩니다."); if("\0")puts("if(\"\\0\")은 실행됩니다."); if("")puts("if(\"\")은 실행됩니다."); if('\n')puts("if(\'\\n\')은 실행됩니다."); if('\0');else puts("if(\'\\0\')은 실행되지 않습니다."); if(EOF)puts("if(EOF)은 실행됩니다."); printf("\\n은 아스키코드 %d\n",'\n'); printf("\\0은 아스키코드 %d\n",'\0'); printf("EOF는 아스키코드 %d\n",EOF); char input[SIZE]; puts("INPUT ANYTHIN"); while (s_gets(input, SIZE)) printf("input==\"%s\"이므로 while이 계속 실행됩니다.\n",input); puts("THIS IS THE END OF THE PROGRAM"); }