Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 언어에서 정수 입력 후 문자열을 읽지 못하는 이유와 해결 방법

문제 상황

C 프로그래밍에서 scanf로 정수를 입력받은 직후 문자열을 입력받으려고 하면, 컴파일러가 문자열을 전혀 읽지 않고 건너뛰는 현상이 발생합니다. 이 문제의 원인은 무엇이며, 어떻게 해결할 수 있을까요?

원인 분석

정수를 입력한 뒤 Enter 키를 누르면, 입력 버퍼에는 개행 문자(\n)가 그대로 남아 있게 됩니다. 이후 문자열을 읽으려고 하면 scanf는 버퍼에 남아 있는 이 개행 문자를 널(null) 문자처럼 처리하여 문자열의 첫 번째 문자 자리에 저장하고 입력을 즉시 종료해 버립니다. 즉, scanf는 널 문자를 만나면 입력을 중단하기 때문에 사용자가 입력한 실제 문자열은 전혀 읽히지 않는 것입니다.

해결 방법

정수(int)나 실수(float)를 입력받은 직후에 문자열이나 문자를 읽어야 하는 경우에는, 먼저 입력 버퍼에 남아 있는 임시 문자(개행 문자)를 별도의 문자 변수로 읽어서 제거해 주어야 합니다.

다음은 오류 없이 정상적으로 동작하는 프로그램 예제입니다.

예제 코드

#include <stdio.h>
struct student{
    char name[10];
    int roll;
    char temp;
} s;
int main(){
    printf("Enter information of students:\n");
    printf("\nEnter roll number: ");
    scanf("%d", &s.roll);
    scanf("%c",&s.temp); // 임시 문자(개행 문자) 읽기
    printf("\nEnter name: ");
    gets(s.name);
    printf("\nDisplaying Information of students:\n");
    printf("\nRoll number: %d\t", s.roll);
    printf("\nname:%s\t", s.name);
    return 0;
}

실행 결과

Enter information of students:
Enter roll number: 3
Enter name: tutorialspoint
Displaying Information of students:
Roll number: 29806
name:tutorialspoint

추가 팁

위 예제에서 사용된 gets() 함수는 입력 길이를 제한하지 못해 버퍼 오버플로우 위험이 있으므로, 실무에서는 fgets(s.name, sizeof(s.name), stdin)과 같이 안전한 대체 함수를 사용하는 것이 좋습니다. 또한 scanf("%d", &s.roll) 대신 scanf("%d\n") 형식으로 개행 문자를 소비하거나, getchar()를 호출하여 버퍼를 비우는 방법도 널리 활용됩니다.