C 언어 학습 노트——scanf(%[^n]%c)
scanf 및 형식 지정자
参考【scanf, fscanf, sscanf, scanf_s, fscanf_s, sscanf_s - cppreference.com】
우리가 이해해야 할 것은 [%*[^\n]% c]입니다 . 이제 이를 [% [^\n]] [%*c] 두 부분 으로 나눕니다 .
각 변환 지정자 일치는 백분율 기호[%]로 시작됩니다.
% 뒤의 별표 [*]는 [할당 억제 문자]를 의미하며, 이는 scanf 함수의 일치 결과를 받아들이는 데 매개 변수가 필요하지 않음을 의미합니다.
예를 들어:
#include <stdio.h>
int main(void)
{
int number = 0;
printf("input a number: ");
scanf("%d", &number);
printf("number is [%d]\n", number);
return 0;
}
사용자는 번호를 입력하고 이를 변수 번호에 할당해야 합니다.
실행 결과는 다음과 같습니다.
% 뒤에 *를 추가하여 %*d가 되면 숫자에 할당되지 않습니다.
#include <stdio.h>
int main(void)
{
int number = 0;
printf("input a number: ");
scanf("%*d", &number); // add *
printf("number is [%d]\n", number);
return 0;
}
실행 결과는 다음과 같습니다.
사용자가 입력한 번호는 변수 번호에 할당할 수 없음을 알 수 있습니다. [% c]는 문자와 일치하지만(%c는 일치하는 문자임) 변수에 할당하지 않음을 의미합니다. 그렇다면 [% [^\n]]은 무슨 뜻인가요 ? \n은 개행 문자입니다. 대괄호 [ ]는 집합을 나타냅니다. 예, 고등학교 수학 첫 수업의 집합입니다. 집합의 첫 번째 문자가 ^이면 집합에 없는 문자와 일치합니다. (고등학교에서 배운 보완 세트) 세트의 내용은 다음과 같은 범위일 수도 있습니다: [1-9], [az]
#include <stdio.h>
int main(void)
{
char str[100];
printf("input a number: ");
scanf("%[a-zA-Z]", str);
printf("[%s]\n", str);
return 0;
}
실행 결과는 다음과 같습니다.
요약하면 [%*[^\n]]은 개행 문자 앞의 모든 문자와 일치하지만 값을 할당하지는 않습니다.
% 뒤에 숫자를 추가하여 일치하는 문자 수를 나타낼 수도 있습니다.
#include <stdio.h>
int main(void)
{
char str[100];
printf("input a number: ");
scanf("%5[a-zA-Z]", str); // note 5
printf("[%s]\n", str);
return 0;
}
실행 결과는 다음과 같습니다.
5자만 일치함
%*[^\n]이 문자와 일치할 수 없으면 다음 %*c도 일치하지 않습니다. 그러므로 우리는 개행 문자를 흡수하고 이 두 문장을 분리해야 합니다.
scanf("%*[^\n]");
scanf("%*c");
요약하다:
와일드카드 문자 % [^\n]은 개행 문자까지 모든 문자를 건너뛰는 것을 의미합니다.
^for (i=0;i<2;i++) fscanf(fin,"% [^\n]% c"); 2줄을 건너뜁니다.
%는 "건너뛰기"[^\n]를 의미합니다 . 문자열 구분 기호는 "\n"입니다. \n 앞의 모든 문자열을 건너뛰려면
대괄호 %*[^\n] 안에 구분 기호 테이블을 작성할 수 있습니다 . %*c는 줄 끝을 "건너뛰는" 개행 문자입니다.
수정일: 2022년 12월 8일