Post

C++ 문자열 및 문자 입력 정리

헷깔려서 적은 문자 및 문자열 관련 입력 정리 (유니코드는 제외했다.)

포스트에서 활용할 변수들

string 객체

1
2
#include <iostream>
std::string str;

비고: STL에서 제공하는 클래스

  1. 문자열 끝에 '\0' 문자가 들어가지 않음
  2. <iostream> 헤더는 <string> 헤더를 내부적으로 포함함.

char형 배열

1
char str[20];

FILE 구조체 포인터

1
FILE * fp;

비고: 파일 입출력에 관한 내용은 참고자료 참조

cin 클래스

정의: <istream> (지금부터 설명할 cin의 멤버함수들도 <istream> 헤더에 정의되어 있다.)

비고: <istream> 헤더는 string 클래스가 추가되기 전부터 C++의 일부였기에 string 형은 인식하지 못한다고 함.

» 연산자

1
2
3
4
5
6
std::string str1
char str2[20];

std::cin >> str1;
std::cin >> str2;
//사용법: cin >> "입력받을 변수"

입력 종류: 공백을 포함하지 않은 문자열, 문자

사용 변수: string 객체, char형 배열, char형 변수

cin.getline(char*, int)

1
2
3
4
5
char str[20];
std::cin.getline(str, 20);

//첫 번째 매개변수: (char형) 입력받은 문자열을 저장할 배열
//두 번째 매개변수: 저장할 문자의 수 +1 (맨 마지막 문자는 '\0' 문자를 넣어야 함)

입력 종류: 공백을 포함한 문자열

사용 변수: char형 배열

cin.get(char*, int)

1
2
3
4
5
char str[20];
std::cin.get(str, 20);

//첫 번째 매개변수: (char형) 입력받은 문자열을 저장할 배열
//두 번째 매개변수: 저장할 문자의 수 +1 (맨 마지막 문자는 '\0' 문자를 넣어야 함)

입력 종류: 공백을 포함한 문자열

사용 변수: char형 배열

비고: 앞서 설명한 getline 멤버함수와 같지만, 버퍼의 '\n' 개행문자가 제거되지 않는다는 차이점이 있다.

cin.get()

1
2
char ch;
ch = std::cin.get();

입력 종류: 문자

사용 변수: char형 변수

비고: 문자(개행포함)를 단 하나만 입력받는 cin.get 함수의 다른 사용법.

<stdio.h>에 정의된 일반 함수

비고: 함수의 return 값은 적지 않음.

getline(FILE*, std::string, int)

1
2
3
4
5
6
7
8
9
std::string str;
FILE * fp = fopen("file_name", "r");
getline(cin, str);
getline(fp, str, 20);
fclose(fp);

//첫 번째 매개변수: 파일 포인터
//두 번째 매개변수: 입력 받을 변수 (string 형)
//세 번째 매개변수: 저장할 문자의 수

입력 종류: 공백을 포함한 문자열

사용 변수: string 객체

scanf(const char *, …)

1
2
3
4
5
6
char ch;
char str[20];
scanf("%s %c", str, ch);

// 첫 번째 매개변수: 입력받을 변수의 종류를 적은 문자열
// 두 번째 + α 매개변수: 입력받을 변수들

입력 종류: 공백을 포함하지 않은 문자열, 문자

사용 변수: char형 배열, char형 변수

fscanf(FILE*, const char *, …)

1
2
3
4
5
6
7
8
char str[20];
FILE * fp = fopen("file_name", "r");
fscanf(fp, "%s %c", str, ch);
fclose(fp);

// 첫 번째 매개변수: 파일 포인터
// 두 번째 매개변수: 입력받을 변수의 종류를 적은 문자열
// 세 번째 + α 매개변수: 입력받을 변수들

입력 종류: 공백을 포함하지 않은 문자열, 문자

사용 변수: char형 배열, char형 변수

비고: scanf와 입력되는 방식은 같으나, scanf는 표준입력, fscanf는 파일에서 입력을 가져온다는 차이점이 있다.

getchar()

1
2
char ch;
ch = getchar();

입력 종류: 문자

사용 변수: char형 변수

getc(FILE*)

1
2
3
4
char ch;
ch = getc(stdin);

// 첫 번째 매개변수: 파일 포인터

입력 종류: 문자

사용 변수: char형 변수

비고: getc(stdin)getchar()와 완전히 같다.

fgetc(FILE*)

비고: getc() 함수와 기능은 완전히 같으나, 기능 호출로만 정의되고, 매크로로 대체되지 않음.

gets(char*)

1
2
3
4
char str[20];
gets(str);

// 첫 번째 매개변수: 입력 받을 변수

입력 종류: 공백을 포함한 문자열

사용 변수: char형 배열

비고: 글자 수에 상관없이 입력을 받기 때문에 메모리 공간까지 침범할 가능성이 존재함.

fgets(char*, int, FILE*)

1
2
3
4
5
6
char str[20];
fgets(str, 20, stdin);

// 첫 번째 매개변수: 입력 받을 변수
// 두 번째 매개변수: 저장할 문자의 수 +1 (맨 마지막 문자는 '\0' 문자를 넣어야 함)
// 세 번째 매개변수: 파일 포인터

입력 종류: 공백을 포함한 문자열

사용 변수: char형 배열

비고: 입력받을 문자의 수를 입력하므로 두 번째 매개변수를 잘못 입력하지 않는 한 메모리 공간 침범 가능성이 적음.

입력과 관련된 함수

cin.clear()

1
std::cin.clear();

비고: cin.get() 함수가 빈 행을 읽으면 failbit 라는것이 설정. 한마디로 계속되는 입력을 막는 것. 이를 해제하기 위해서 사용하는 함수이다.

ungetc(int c, FILE * stream)

1
2
3
4
5
char ch = 'c';
ungetc(ch, stdin);

// 첫 번째 매개변수: 입력할 문자
// 두 번째 매개변수: 파일 포인터

비고: ch를 파일 맨앞에 넣을 수 있는 함수. 두 번째 매개변수에 stdin을 입력하면 버퍼에 ch가 들어감. 주로 입력받은 문자를 다시 넣을 때 사용.

참고자료

This post is licensed under CC BY 4.0 by the author.