본문 바로가기
Computer Science/C 언어

[C #16] 문자열 입력 기본 함수와 상황별 선택

by rnasterofmysea 2024. 12. 14.
반응형

코딩 테스트에서 C언어로 문자열 입력을 처리할 때는 제한된 시간과 메모리 내에서 효율적으로 입력받아야 합니다. 이를 위해 몇 가지 팁을 정리했습니다.


1. 문자열 입력 기본 함수와 상황별 선택

1) scanf (주로 사용)

  • 사용 조건: 공백 없이 단일 문자열 입력.
  • 사용 예:
    char str[100];
    scanf("%s", str);
    
  • 장점:
    • 간단하며 대부분의 테스트 케이스에 적합.
  • 주의:
    • 공백 기준으로 입력이 끊기므로 여러 단어 입력이 필요한 경우 적합하지 않음.

2) fgets (공백 포함 입력)

  • 사용 조건: 공백을 포함한 한 줄 입력.
  • 사용 예:
    char str[100];
    fgets(str, sizeof(str), stdin);
    
  • 장점:
    • 공백 포함 문자열 입력 가능.
  • 주의:
    • 입력 끝에 줄바꿈 문자(\n)가 포함되므로 제거 필요:
      str[strcspn(str, "\n")] = '\0'; // 줄바꿈 제거
      

3) getchar (문자 단위로 입력)

  • 사용 조건: 반복문으로 문자 단위 입력 필요.
  • 사용 예:
    char str[100];
    char ch;
    int i = 0;
    while ((ch = getchar()) != '\n' && ch != EOF) {
        str[i++] = ch;
    }
    str[i] = '\0';
    
  • 장점:
    • 자유로운 입력 처리 가능.
  • 주의:
    • 여러 줄 입력이나 대규모 입력에는 적합하지 않음.

2. 긴 문자열 입력 처리

코딩 테스트에서는 종종 문자열 길이가 크거나 미정인 경우가 있습니다. 이런 상황에서는 동적 메모리 할당이 유용합니다.

동적 메모리로 문자열 입력:

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

int main() {
    int size = 100;
    char *str = (char *)malloc(size);
    if (!str) return 1;

    int index = 0;
    char ch;
    printf("문자열을 입력하세요: ");

    while ((ch = getchar()) != '\n' && ch != EOF) {
        if (index >= size - 1) { // 메모리 초과 시 확장
            size *= 2;
            str = (char *)realloc(str, size);
            if (!str) return 1;
        }
        str[index++] = ch;
    }
    str[index] = '\0'; // 문자열 종료
    printf("입력된 문자열: %s\n", str);

    free(str); // 메모리 해제
    return 0;
}

3. 코딩 테스트에 유용한 팁

1) 입력 데이터가 많을 경우 scanf와 버퍼를 조합

  • 입력 속도가 중요할 때, 버퍼를 사용하여 입력 속도를 최적화합니다.
#include <stdio.h>
#define SIZE 100000

int main() {
    char buffer[SIZE];
    fread(buffer, 1, SIZE, stdin); // 대량 입력
    printf("입력된 데이터: %s\n", buffer);
    return 0;
}
  • 장점:
    • 입력 속도 매우 빠름.
    • 대규모 입력 데이터를 빠르게 처리 가능.

2) freopen으로 파일 입력 처리

  • 코딩 테스트에서 파일 입력이 주어지는 경우:
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
  • 입력과 출력을 파일로 리디렉션하여 처리.

3) 줄바꿈 제거 및 입력 정리

  • 줄바꿈 문자 제거:
    str[strcspn(str, "\n")] = '\0';
    
  • 공백을 포함한 문자열 입력:
    char str[100];
    fgets(str, sizeof(str), stdin);
    

4. 주의사항

  1. 입력 제한 고려:
    • 문제에서 주어진 문자열 길이 제한을 확인하고 배열 크기를 적절히 설정.
  2. 입력 종료 처리:
    • EOF나 특정 종료 조건을 처리하는 로직 필요.
  3. 버퍼 초기화:
    • 입력 전에 배열을 초기화하거나, 쓰레기 값이 남지 않도록 주의.
  4. 시간 제한 고려:
    • 너무 복잡한 문자열 처리는 시간 초과 위험이 있으므로 효율적인 방식 선택.

5. 추천 함수와 상황

함수 공백 포함 동적 메모리 사용 대규모 입력 추천 상황

scanf 공백 없는 간단한 입력
fgets 한 줄 전체 입력 필요
getchar 문자 단위 입력 필요
동적 메모리 문자열 크기가 불확실한 경우
버퍼 (fread) 대규모 입력 처리

이 팁들을 활용하면 C언어로도 빠르고 효율적으로 문자열 입력을 처리할 수 있습니다!

반응형