작성
·
778
0
안녕하세요
printf("Input a color name (empty line to quit):\n");을 받고 입력을 할 때 빈칸인 상태로 엔터를 누르면 프로그램이 끝나도록 하는 코드를 작성하는 과정에서 난항을 겪어서요. 몇 가지 여쭤보려고 합니다.
제가 시도했던 것들은 밑에 두 가지입니다.
첫 번째는 문자열이랑 문자를 비교해서 실행이 제대로 안된다는 것을 깨달았고, 두 번째도 문자열이랑 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
안녕하세요
하나씩 답변드리겠습니다.
네 맞습니다, 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