인프런 커뮤니티 질문&답변
scanf() 정규 문자 질문 드립니다
해결된 질문
작성
·
38
1
안녕하세요
scanf("%d,%d", &i1, &i2);이번 수업으로 , 콤마를 통해 입력 값을 구분할 수 있다는걸 배웠는데요.
구분자를 빈칸 혹은 콤마 둘 중에 하나를 써도 입력이 될 수 있는 방법이 있는지 궁금합니다.
답변 2
1
안녕하세요? 질문&답변 도우미 durams입니다.
콤마에 입력값을 구분하는 특수한 기능이 있지는 않습니다. scanf의 인자로 전달된 패턴에 속하는 하나의 문자로써 사용자가 입력하는 값과 비교가 이루어질 뿐입니다.
int i1, i2;
scanf("%dabcdefg%d", &i1, &i2);
printf("%d %d\n", i1, i2); 예를 들어 위 코드에 1abcdefg2와 같이 입력하면 1 2가 출력됩니다. 두 개의 %d 사이에 위치한 abcdefg가 scanf에서 요구하는 패턴과 일치한 것이죠.
빈칸과 콤마 둘 모두를 통해 입력값을 구분하려면 문자열을 입력받은 후 직접 파싱(처리)하거나, 또는 정규 표현식 라이브러리를 사용할 수 있습니다.
또는 간단하게 해결하고자 한다면 아래와 같이 scanf의 scanset 기능을 사용해 작성할 수도 있습니다. 첫 번째 정수 와 두 번째 정수 사이의 모든 공백문자 + 쉼표를 읽고 저장은 하지않는다는 의미입니다. ^와 [], 그리고 *의 의미는 이후 강의에서 등장할 예정이니 지금은 참고용으로만 봐 두셔도 충분합니다.
scanf("%d%*[ ,\t\n]%d", &i1, &i2);0
안녕하세요, 인프런 AI 인턴입니다. Lucas님.
입력을 받을 때, 특정 구분자를 허용하기 위해서는 여러 방법을 사용할 수 있습니다. 기본적으로 scanf 함수는 특정한 입력 형식을 요구하기 때문에 빈칸이나 콤마 둘 중 하나를 선택하여 입력하실 수 있도록 하려면 scanf 대신 다른 방법을 고려해보는 것이 좋습니다.
scanf 자체로는 원하는 결과를 바로 얻기 어려울 수 있어서, 일반적으로 fgets를 사용하여 입력을 받은 후, 이를 sscanf로 처리하면 더욱 유연한 입력 처리가 가능합니다. 예를 들어 사용자로부터 문자열로 입력을 받은 후 문자열을 파싱(parse)하여 숫자로 변환하는 방법입니다.
다른 대안으로 scanf("%d%*1[ ,]%d", &i1, &i2);를 시도해보실 수 있습니다. 이 형식 지정자는 두 번째 정수를 읽기 전, 공백이나 콤마가 오는 경우를 허용하도록 구성되어 있습니다. 그러나 이 방법은 특정 상황에서는 완벽하게 작동하지 않을 수 있어, 위의 fgets와 sscanf 방법을 더 추천드립니다.
관련된 개념으로는 문자열을 파싱할 때 자주 사용되는 함수나 기법을 더욱 익혀두시면 많은 도움이 될 것입니다.
유사한 질문들도 있습니다. 여기에서 다른 유사한 scanf 사용법도 다양한 답변을 얻을 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.





