Minwoo Dev.

[백준 4470번] 줄번호 - C99 본문

백준

[백준 4470번] 줄번호 - C99

itisminu 2023. 6. 6. 10:29
728x90
반응형
SMALL

문자열에 숫자를 붙여서 출력하는 문제이다.

먼저 문자열을 입력받고, 그 문자열의 앞에 숫자를 추가하는 방법과

따로 출력하여 붙어있는 것처럼 보이는 방법 두 가지가 생각났는데, 일단 후자의 방법을 선택하여 문제를 풀었다.

C언어에서는 문자열을 입력받기 위해 배열을 사용해야 한다.

그리고 나는 여러 개의 문자열을 입력받기 위해 이중 배열을 사용하여 한 변수에 입력값을 모두 저장하고자 하였다.

 

#include <stdio.h>
#include<string.h>

int main(void) {
  int n = 0; //처음에 입력받을 변수
  char a[99][52]; //문자열을 입력받을 배열
  scanf("%d", &n);

  getchar();

  for (int i = 0; i < n; i++) {
    fgets(a[i], sizeof(a[i]), stdin);
  }

  for (int i = 0; i < n; i++) {
    printf("%d. %s", i + 1, a[i]);
  }

  return 0;
}

 

이 문제에서는 띄어쓰기가 포함된 문장을 입력받아야 하기에, scanf가 아닌 gets함수를 사용해야 하지만, 보안상의 이유로 fgets함수를 사용하라고 해서 fgets 함수를 사용하였다.

그리고 이 문제에서 헤메던 부분은 getchar 함수인데, getchar 함수를 사용하지 않고 이 코드를 실행할 경우 출력되는 문자열들이 하나씩 빠지는 현상이 발생하였다.

이유를 찾아보니 scanf 함수가 데이터를 입력받을 때 값을 입력하고 엔터를 누른다.

변수에는 값이 들어가지만 버퍼 상에는 '엔터' 값이 남아있다.

그래서 버퍼 상에서 이 엔터값을 비워주지 않는다면 다음 값을 입력할 때 오류가 발생하는 것이다.

따라서 fflush(stdin)을 사용하거나 getchar() 함수를 사용하여 값을 비워줘야 한다.

그리고 배열의 크기를 51으로 지정해도 문제가 해결되지 않았다.

52로 설정하니 문제가 해결되었다.

내 생각에 엔터값을 함께 인식하여 51에서도 데이터가 오류나는 현상인 거 같다.

 

728x90
반응형
LIST