21장. 문자와 문자열 관련 함수
1. 스트림과 데이터의 이동
- 입력 : 프로그램 안으로 데이터가 들어오는 것
- 출력 : 프로그램 밖으로 데이터가 흘러나가는 것
- 스트림 : 모니터와 키보드 사이의 가상의 다리 역활 ( 자동으로 생성 및 종료 )
- stdin : 표준 입력 스트림 (키보드 대상으로 입력)
- stdout : 표준 출력 스트림 (모니터 대상으로 출력)
- stderr : 표준 에러 스트림 (모니터 대상으로 출력)
2. 문자 단위 입,출력 함수
- printf, scanf 도 있지만, 서식지정을 통하여 입출력의 형태를 구성하므로, 메모리 공간도 크고, 해야 할 연산의 양이 많아 상대적으로
속도가 느리다. 또한 문장을 구성하는것도 번거롭다.
- 문자 출력 : putchar, fputc
- 문자 입력 : getchar, fgetc (입력버퍼에 \n 문자도 함께 저장)
- EOF(End Of File) : 파일의 끝을 표현, -1로 정의된 상수
getchar, fgetc : 함수 호출의 실패, CTRL+Z, CTRL+D 키 입력시 EOF 반환
# include <stdio.h>
int main(void)
{
int ch1, ch2;
ch1 = getchar(); // stdin에서 문자를 입력받음, getchar()에서 입력버퍼로 a+\n 값 저장 후
// ch1 으로 단어 하나 a를 반환.
ch2 = fgetc(stdin); // 입력버퍼에 아직 \n 값 남아있음, 자동으로 ch2에 \n값이 저장
putchar(ch1); // ch1을 stdout 으로 출력, a
fputc(ch2, stdout); // ch2을 지정스트림(stdout) 으로 출력, \n file 도 가능
return 0;
}
3. 문자열 단위 입,출력 함수
- 문자 출력 : puts, fputs
- 문자 입력 : gets, fgets
ex) gets(str) //입력받은 문자열을 str 에 저장
fgets의 특징 : 자동으로 문자열의 끝에 널 문자 추가
\n을 만날때까지 문자열을 읽어 들이는데, \n 도 함께 저장
엔터입력시 입력버퍼로 데이터가 들어감
#include <stdio.h>
int main(void)
{
char* str = "Simple String";
printf("1. puts test-----\n");
puts(str);
puts("So Simple String");
printf("2. fputs test----\n");
fputs(str, stdout);
fputs("So Simple String",stdout);
printf("3. finall---\n");
}
// 결과 출력 , 즉 fputs는 자동으로 개행이 이루어지지 않는다.
1. puts test-----
Simple String
So Simple String
2. fputs test----
Simple StringSo Simple String3. finall----
int main(void)
{
char str[7];
int i;
for (i = 0; i < 3; i++) {
//gets(str); //입력받은 문자열을 배열 str 에 저장, 배열의 크기 이상이면 오류 발생, 즉 fgets 이용
fgets(str, sizeof(str), stdin); //stdin으로 문자열을 입력받아 배열 str에 저장하되, str의 크기만큼 저장,
//즉, 10개의 문자를 입력시 4개의 문자는 입력버퍼에 남아있다.
printf("Read %d: %s \n", i + 1, str);
}
return 0;
}
// 결과 출력
123456789012345
Read 1: 123456
Read 2: 789012
Read 3: 345
4. 표준 입출력과 버퍼 ( 예제 꼭 확인하고 넘어가기! )
- 키보드 -> 입력 스트림 -> 입력 버퍼(메모리) -> 실행중인 프로그램
- 출력버퍼를 비우기(데이터가 목적지로 이동) : fflush(stdout)
#include <stdio.h>
//void clear(void) {
// while (getchar() != '\n');
//}
int main(void)
{
char perID[7];
char name[10];
fputs("주민번호 앞 6자리 입력 : ", stdout);
fgets(perID, sizeof(perID), stdin);
// clear() ; // 입력 버퍼 비우기
fputs("이릅 입력 : ", stdout);
fgets(name, sizeof(name), stdin);
printf("주민번호:%s \n", perID);
printf("이름:%s \n", name);
return 0;
}
// 결과 출력
주민번호 앞 6자리 입력 : 931220-2844444
이릅 입력 : 주민번호:931220 // 입력버퍼에 \n의 값이 존재하여, 입력할 기회를 주지않고 바로 값 저장후 넘어감
이름:-2844444
- 입력버퍼 비우기 : clear 코드 추가
입력버퍼에 저장된 문자들을 읽어들이면 지워진다.
즉 getchar() : 문자를 하나씩 읽어옴, 읽어온 문자가 \n이면 while값이 false 로 되어 종료!
장점 : 프로그램 사용자가 잘못 입력을해도, 필요한 만큼만 읽어 들이고 나머지는 지워버린다.
5. 그 외 함수
- strlen : 문자열의 길이 반환 ( null 문자 - '\0' 는 길이에서 제외 시킨다. )
ex ) strlen(str)
- strcpy,strncpy : 문자열 복사
ex) strcpy( (char*)str2, (char*)str1) // str1 의 문자열을 str2 에 복사
strncpy( (char*)str2, (char*)str1, sizeof(str2)); str1의 문자열을 str2 에 복사하되, sizeof(str2)의 크기만큼 복사를 진행!
int main(void)
{
char str1[20] = "1234567890";
char str3[5];
strncpy(str3, str1, sizeof(str3)); // str3 에 12345 저장이 됩니다.
puts(str3); // 오류발생, puts 함수는 null 값까지 출력을 하나, null 값이 저장되지 않아, 어디까지 출력을 해야할지
//puts 함수가 판단을 할 수 없습니다.
strncpy(str3, str1, sizeof(str3) - 1); //str3에 1234 저장
str3[sizeof(str3) - 1]= 0; // 마지막배열에 null 값을 입력해 줍니다.
puts(str3);
return 0;
}
- strcat, strncat : 문자열 덧붙임
ex) strcat((char*)str1, (char*)str2) // str1의 문자열 뒤에 str2 를 복사
strncat((char*)str1, (char*)str2, 8) //str2 의 문자중 최대 8개를 str1의 뒤에 덧붙여라!
결과 > str1+str2(8문자) + null문자( 자동 )
- strcmp, strncmp : 문자열 비교
ex ) strcmp((const char *)s1,(const cahr * ) s2) // S1이 더크면 양수 반환 , 작으면 음수 반환, 같으면 0반환
strncmp("S1", "S2", 3) // 3번째 문자 까지만 비교
- int atoi, long atol, double atof : 형변환 함수
ex) atoi(str) // 문자를 int형으로 변환, 나머지 동일
열혈 C 프로그래밍 참조
'C언어' 카테고리의 다른 글
C언어 다차원배열과 포인터 (0) | 2020.01.15 |
---|---|
C언어 자료형과 기본 출력 함수 (0) | 2020.01.14 |
C언어 포인터와 배열 (0) | 2020.01.14 |