인프런 커뮤니티 질문&답변

kimtaegyun99님의 프로필 이미지
kimtaegyun99

작성한 질문수

홍정모의 따라하며 배우는 C언어

11.4 문자열을 입력받는 다양한 방법들

22분 코드 논리 연산 관련해 질문있습니다.

작성

·

168

0

22분 작은 버퍼를 반복해 사용해 큰 버퍼를 사용하는 것처럼 보이는 코드입니다.

int main()

{

char small_array[5];

puts("Enter long strings:");

while (fgets(small_array,5, stdin) != NULL && small_array[0] != '\n')

fputs(small_array, stdout);

}

여기서 while (fgets(small_array,5, stdin) != NULL && small_array[0] != '\n') 를 안쪽의 &&대신에 || 을 사용해봤습니다. 제 예상은 엔터만 입력할시 종료되는것이었는데, 엔터를 치니 그냥 엔터로 받고 출력까지 하는것을 보았습니다. 왜 그런 건가요? 

------------------------------------------------------------

조금 더 고민해봤습니다.

제가 이해한 바로는 

&& :  NULL이거나 엔터거나 둘중 하나면 아웃.

||     :  NULL이거나 엔터거나 둘다 만족하면 아웃.

||일때 엔터 치면 못빠져나오고 반복하는 것을 보아, NULL 이 아니거나, small_array[0]가엔터가 아니어서 만족을 못한다는 것인데, 둘 중에 뭘 만족 못하는지 모르겠습니다.

--------------------------------------------------------

코드를 살짝 고쳐가면서 보아 엔터만 쳤을때는 NULL 이 아닌것을 확인했습니다. 왜 엔터를 쳤을땐 아무 입력도 없는데 NULL값이 아닌가요? fgets를 써서 \n이 자동으로 없어지지 않아서 그런건가요?

답변 1

2

안녕하세요!

fgets는 입력을 성공할 땐 입력한 배열 small_array를, 입력에 실패할 땐 (즉 버퍼에서 가져올게 아무것도 없었을 때) NULL을 리턴합니다.

또한 fgets는 '\n' 또한 읽어들여 배열에 저장하는 함수입니다.

따라서 엔터만 치시면 fgets 자체는 NULL을 리턴하는게 아니라 small_array를 리턴하고 small_array[0]에 '\n'이 들어오게 되므로 small_array[0] 은 '\n'이 됩니다.  small_array는 크기가 5인 배열이니 [ '\n' '\0' 쓰레기 쓰레기 쓰레기 ] 이런 모양이 되겠네요 !

AND && 👉 fgets가 NULL 이거나 small_array[0]이 '\n' 이면 while문을 더 이상 돌지 않고 종료

OR || 👉 fgets가 NULL 이고 동시에 small_array[0] 도 '\n'여야지만 while문을 더 이상 돌지 않고 종료

따라서 && 가 아닌 || OR을 사용하시게 되면 엔터만 입력해도 small_array에 잘 들어가므로 fgets 는 NULL을 리턴하지 않으니 또 while문 반복 조건 참이 되기 때문에 끝나지 않는 것입니다. OR조건은 둘 중 하나라도 참이면 참인데 fgets가 NULL이 아니라는 조건 하나 하나가 참이니까 안끝나는 것이에요. 반면 AND 를 사용했을 땐 하나라도 거짓이면 조건식 자체가 거짓이 되는데 small_array[0]가 NULL 이 아니라는 조건식이 거짓이니까 엔터만 입력햇을 떈 바로 종료되는 것입니다.

kimtaegyun99님의 프로필 이미지
kimtaegyun99

작성한 질문수

질문하기