logo

C의 scanf() 및 fscanf()

C언어에서는 스캔프() 함수는 stdin에서 형식화된 입력을 읽는 데 사용됩니다. 그 안에 쓰여진 전체 문자 수를 반환하고, 그렇지 않으면 음수 값을 반환합니다.

통사론:



int scanf(const char *characters_set)>

시간 복잡도: 에)

보조 공간: O(n) 여기서 n은 입력 길이입니다.

우리 중 많은 사람들이 scanf의 전통적인 사용법을 알고 있습니다. 글쎄, 여기에 덜 알려진 사실이 있습니다.



노트북 삽입 키

필요한 입력의 일부만 읽는 방법은 무엇입니까?
예를 들어, 정수나 부동소수가 뒤따르는 문자만 포함하는 일부 입력 스트림을 생각해 보십시오. 그리고 해당 정수 또는 부동소수점만 스캔하면 됩니다.

예:

  Input  : 'this is the value 100',    Output  : value read is 100   Input   : 'this is the value 21.2',    Output   : value read is 21.2>
// C program to demonstrate that // we can ignore some string // in scanf() #include  int main() {  int a;  scanf('This is the value %d', &a);  printf('Input value read : a = %d', a);  return 0; } // Input : This is the value 100>


이제 앞의 문자가 무엇인지 모르지만 마지막 값이 정수라는 것은 확실히 알고 있다고 가정합니다. 마지막 값을 정수로 어떻게 스캔할 수 있나요?



아래 솔루션은 입력 문자열에 공백이 없는 경우에만 작동합니다. 예를 들어,

입력

'blablabla 25'>
// C program to demonstrate use of *s #include  int main() {  int a;  scanf('%*s %d', &a);  printf('Input value read : a=%d', a);  return 0; }>

산출

Input Value read : 25>

설명 : scanf의 %*s는 필요에 따라 일부 입력을 무시하는 데 사용됩니다. 이 경우 다음 공백이나 줄 바꿈까지 입력을 무시합니다. 마찬가지로 %*d를 쓰면 다음 공백이나 개행 문자까지 정수를 무시합니다.

scanf( )의 일반적인 사용법:

// C program to demonstrate general use of scanf() #include  int main() {  int a;  scanf('%d', &a);  printf('a = %d', a);  return 0; }>

입력

2>

산출

a = 2>

위의 사실은 언뜻 보면 유용한 트릭처럼 보이지 않을 수도 있습니다. 사용법을 이해하기 위해 먼저 fscanf()를 살펴보겠습니다.

C의 fscanf 함수

파일에서 읽는 모든 서투른 구문에 지치셨나요? 음, fscanf가 구출됩니다. 이 함수는 C 언어로 지정된 스트림에서 형식화된 입력을 읽는 데 사용됩니다.

통사론:

int fscanf(FILE *ptr, const char *format, ...)>

fscanf는 입력 스트림에서 읽는 대신 FILE 포인터(ptr)가 가리키는 파일에서 읽습니다.

반환 값: 실패할 경우 0 또는 EOF를 반환합니다. 그렇지 않으면 성공적으로 할당된 항목 수를 반환합니다.

시간 복잡도: 에)

보조 공간: O(n) 여기서 n은 입력의 길이입니다.

멍청한 평균

예시 1: 다음 텍스트 파일 abc.txt를 고려해 보세요.

NAME AGE CITY abc 12 hyderabad bef 25 delhi cce 65 bangalore>

이제 위 텍스트 파일의 도시 필드만 읽고 다른 모든 필드는 무시하려고 합니다. 위에서 언급한 fscanf와 트릭을 결합하면 이 작업이 쉽게 수행됩니다.

// C Program to demonstrate fscanf #include  // Driver Code int main() {  FILE* ptr = fopen('abc.txt', 'r');  if (ptr == NULL) {  printf('no such file.');  return 0;  }  /* Assuming that abc.txt has content in below  format  NAME AGE CITY  abc 12 hyderabad  bef 25 delhi  cce 65 bangalore */  char buf[100];  while (fscanf(ptr, '%*s %*s %s ', buf) == 1)  printf('%s
', buf);  return 0; }>

산출

CITY hyderabad delhi bangalore>

예시 2: 다음 바이너리 파일 program.bin을 고려하세요.

n1 n2 n3 1 5 6 2 10 11 3 15 16 4 20 21>

bin의 n1, n2 & n3 값을 모두 읽으려면 fscanf()를 사용합니다.

#include  #include  struct threeNum{  int n1, n2, n3; }; int main(){  int n;  struct threeNum num;  FILE *fptr;  if ((fptr = fopen('program.bin','rb')) == NULL){  printf('Error! opening file');  // Program exits if the file pointer returns NULL.  exit(1);  }  for(n = 1; n < 5; ++n){  fread(&num, sizeof(struct threeNum), 1, fptr);  printf('n1: %d	n2: %d	n3: %d', num.n1, num.n2, num.n3);  }  fclose(fptr);  return 0; } //Code submitted by Susobhan Akhuli>

산출

n1: 1 n2: 5 n3: 6 n1: 2 n2: 10 n3: 11 n1: 3 n2: 15 n3: 16 n1: 4 n2: 20 n3: 21>

차이점을 표 형식으로 살펴보겠습니다.

스캔프() fscanf()
1. 표준 입력을 읽는 데 사용됩니다.이 함수는 파일에서 입력을 읽는 데 사용됩니다.
2.

구문은 -:

scanf(const char *형식, …)

키보드에 삽입

구문은 -:

fscanf(FILE *스트림, const char *형식, …)

삼. 특정 유형의 입력을 받으려면 형식 지정자가 필요합니다.바이트 형식으로 스트림을 읽습니다.
4.

다음과 같은 세 가지 매개변수를 사용합니다.

공백 문자, 공백이 아닌 문자, 형식 지정자

헤더 파일 #include에 정의되어 있습니다.