편리를 위해 문자와 문자열을 다루기 위한 입출력 함수가 있다.
기존에는 scanf와 printf를 이용하여 형식을 지정하여 입출력하는 형식 입출력함수를 사용했다.
이때 scanf에서 입력할 때 엔터를 꼭 해야 하는데, 이는 속도를 제어하기 위한 버퍼를 사용하고 있기 때문이다.
즉, 임시기억하여 한번에 보내기 위해 버퍼를 사용하는 것이다.
scanf("%d", &a); ....1
scanf("%c", &c); ....2
숫자를 입력하고 나서 엔터키를 누르면 입력된 숫자만 넘어가고 엔터(\n)는 버퍼에 그대로 남게 된다. 이때 다음 scanf도 있기 때문에 문자 엔터가 있으면서 동시에 버퍼를 넘겨주는 문자로 인식하여 버퍼에 있는 \n값이 넘어가고 scanf 입력 기회도 날라가는 것. 2번째 scanf함수에서 %c 형식의 문자를 입력받기 위하여 버퍼에 있는 \n를 없애주어야만 한다.
우리는 일전에 %c앞에 띄어쓰기를 하여 버퍼를 비우는 문자인 엔터와 상쇄시켜 나란한 scanf를 의도한 대로 작동시켰다.
이번에는 문자/문자열 처리함수를 사용하여 버퍼를 비워보기로 하자.
그에 앞서 여러가지 문자/문자열 처리함수를 소개한다. (무조건 문자/문자열이어야 함)
(1) 표준 입출력함수/줄 단위 함수
- stdio.h 에서 가져오는 줄 단위 함수(enter 단위)
1. scanf("%c", &ch); -- printf("%c", ch);
2. ch = getchar(); -- putchar(ch);
3. ch = fgetc(stdin); // 파일 단위지만 키보드를 통해 들어왔다는 의미로 stdin(표준입력)을 적어줘야 함.
-- fputc(ch,stdout); // 파일 위에서 말고 모니터 위에 출력되려고 하면 stdout을 꼭 써줘야 함.
(2) 문자 단위 입력함수
1. ch = _getch(); -- _putch(ch) // 내가 입력한 글자가 화면에 보이지 않음.
2. ch = _getche(); // 내가 입력한 글자가 화면에 보임.
- 대부분은 _안 써도 되는데 비쥬얼 스튜디오에서는 선언하지 않으면 못 씀.
※getchar()을 사용하여 감시값을 읽어내는 알고리즘을 살펴보자. ('q' or EOF(end of file))
(1) 무한루프 (권장하지 않음)
while (1){
ch = getchar();
if(ch == '값시값')
break;
putchar(ch);
}
(2) scanf로 사용할 때
ch = getchar();
while (ch != 감시값){
putchar(ch);
ch = getchar();
}
(3) scanf로 사용하지 않을 때 조건문에 한꺼번에 넣어둠 -> 권장
while((ch=getchar()) != 감시값)
putchar(ch);
문자 처리 라이브러리 함수 소개 (ctype.h)
일전에 아스키코드표를 참고하여 범위를 나누어 알파벳을 비교했는데 그런 방법을 사용하지 않고 문자 처리 라이브러리 함수를 사용하여 문자를 비교할 수 있다.
(1) isalpha(c) : c가 영문자인가?
(2) isupper(c) : c가 대문자인가?
(3) islower(c) : c가 소문자인가?
(4) isdigit(c) : c가 숫자인가? ex. '1', '2', '3' ...
(5) toupper(c) : c를 대문자로 변환
(6) tolower(c) : c를 소문자로 변환
문자열 단위 처리
1. scanf("%s", str); // white character 공백/탭/엔터가 나올 때까지만 읽어서 str에 넣기 때문에 Hello world를 넣고 싶어도 Hello밖에 안 들어감.
2. gets_s(str); // 엔터가 나올 때까지만 읽음 but size보다 크면 \0도 없이 들어가서 문자열 아닌 상태로 들어가게 됨
3. fgets(str, size, stdin) // 엔터가 나올 때까지만 읽음 but size보다 크면 size-1까지 읽고 나머지 한 칸을 \0로 채움
만약 여유로우면 \n과 \0도 받음.
123 -> 123\n\0 사이즈:4
12345 -> 1234\0 사이즈:4 단 버퍼에 5\n가 있음.
4. printf("%s", str); // \0나올 때까지
5. puts(str); // \0나올 때까지
6. fputs(str, stdout) // \0나올 때까지
문자열 처리 함수 (string.h)
1. strlen(str) // str 길이 반환
2. strcpy(str1,str2) // str2를 str1에 복사하고 str1를 반환 이때 str2앞에 const 붙여서 바뀌지 않게
3. strncopy(str1, str2, n) // str2 문자를 n개 str1에 복사함 그래서 \0안 붙음
4. strcat(str1, str2) // str2를 str1을 붙이고 str1을 반환한다.
5. strncat(str1, str2, n) // str2 n개를 str1 뒤에 붙이고 str1 반환, \0는 안 붙인다.
6. strcmp(str1, str2) // str1과 str2 대소비교. 작으면 -1, 같으면 0, 크면 1 반환
문자열 분리, 구분자를 통하여
1. strtok(char *str, const char * delimiter)
// str에서 토큰(단위)을 찾아 반환, 없으면 null 반환
ex. char name[20] = 'Suehee Sue Pak';
char * firstName, *middleName, *lastName;
firstName = strtok(name, " "); // 뒤에 공백이 있을 때
middleName = strtok(NULL, " "): // name으로 하면 안됨
lastName = strtok(NULL, "\0");
8. int atoi(str) // 문자열 숫자를 정수형으로 변환
9. double atof(const char * str) // 문자열을 double형으로 반환
'-' 카테고리의 다른 글
구조체 (0) | 2021.11.16 |
---|---|
자바스크립트 - 연산자, 조건문 (0) | 2021.11.12 |
자바스크립트 (0) | 2021.11.01 |
Chapter 7. Sampling Dist and the Central Limit Theorem(표본분포과 중심극한정리) - (1) 소개 (0) | 2021.11.01 |
수업 (수정전) (2) | 2021.05.14 |
댓글