• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

빈칸을 입력했을 때 break하는 코드 작성에 관하여

22.04.14 09:54 작성 조회수 496

0

안녕하세요 

printf("Input a color name (empty line to quit):\n");을 받고 입력을 할 때 빈칸인 상태로 엔터를 누르면 프로그램이 끝나도록 하는 코드를 작성하는 과정에서 난항을 겪어서요. 몇 가지 여쭤보려고 합니다. 

제가 시도했던 것들은 밑에 두 가지입니다.

  • if (strcmp(choice, '\0') == color_is_found) break;
  • if (choice == NULL) break;

첫 번째는 문자열이랑 문자를 비교해서 실행이 제대로 안된다는 것을 깨달았고, 두 번째도 문자열이랑 0인 NULL은 == 연산자로는 비교를 할 수 없어서 제대로 작동이 되지 않았다고 생각합니다.(제가 찾아보고 내린 결론이라 맞는지도 궁금합니다)

그래서 if (scanf("%[^\n]%*c", choice) != 1) break;를 하면 아무것도 입력안하고 엔터를 입력했을 때 프로그램이 종료되는 것은 확인했지만 왜 위 코드가 이러한 기능을 수행하는지 아직 이해가 되지 않습니다.

질문은 두 가지입니다!

1. 제가 시도했던 것들이 실패한 이유에 대해 제가 생각한 결론(노랑 형광색 부분)이 맞는 것일까요?

2. 왜 if (scanf("%[^\n]%*c", choice) != 1) break;를 하면 첫입력에 엔터를 입력했을 때 프로그램이 종료가 되는건가요? [^\n]이 \n이 나올 때까지 입력을 받는다는 것과 %*c가 마지막글자(\n)을 없앤다는 것도 알고 있지만 왜 break로 연결이 되는지는 아직 이해를 못했습니다. 설명을 해주실 수 있을까요?

답변 1

답변을 작성해보세요.

1

강민철님의 프로필

강민철

2022.04.15

안녕하세요

하나씩 답변드리겠습니다.

 

네 맞습니다, strcmp의 원형은 아래와 같습니다. 아래 원형에 맞게 문자열과 문자열을 비교해야 합니다.

int strcmp (const char* str1, const char* str2);

참고로, strcmp(문자열1, 문자열2)에서 문자열1과 문자열2가 같다면 strcmp는 0을 반환합니다. 

color_is_found 변수 값도 확인해보세요 :)

 

그리고 다음 질문에서, scanf는 성공적으로 입력받은 수를 반환합니다.

가령 아래 코드의 경우,

아무것도 입력하지 않고 엔터를 누르면 결과화면에 0이 나오게 됩니다.

(직접 돌려보세요~)

 

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdbool.h>

int main() {

	char choice[20] = { 0, };

	int result = scanf("%[^\n]%*c", choice);
	printf("result : %d", result);

	return 0;
}

 

질문자님이 제시하신 아래 코드에 따르면 1과 같지 않으면 break이니,

if (scanf("%[^\n]%*c", choice) != 1) break;

 

아무것도 입력하지 않으면 0 != 1 즉 조건문이 true가 되고 break가 실행되는 것입니다.

아래 링크를 보면 같은 질문에 대한 자세한 답변이 나와 있는데, 참고하시면 좋을 것 같습니다.

답변이 되었길 바랍니다.

감사합니다.

https://stackoverflow.com/questions/30065675/what-does-scanf-nc-mean