21. 문자와 문자열 처리 함수
I. 스트림과 데이터의 전송
-
입.출력에 대한 이해
- 말그대로 입력과 출력이 무엇인가에 대해 설명 하는거라 pass 하겠다.
-
입.출력이 가능한 이유는 어디에
-
여기도 간단하게 몇개만 쓰겠다.
- 표준 입력 스트림 : stdin
- 표준 출력 스트림 : stdout
- 표준 에러 스트림 : stderr
-
스트림 이란
- 연속된 데이터의 열을 의미한다.
-
II. 문자 단위 입.출력 함수
-
문자 출력 함수
-
하나의 문자를 출력할 때 일반적으로 putchar와 fputc함수이다.
- putchar : int putchar(int c); 이 함수원형이며 함수 호출시 인자로 받은 문자를 표준출력스트름(대략 모니터) 으로 출력을해준다.
- fputc : int fputc(int c, FILE* stream) 이 함수원형이며, 기본적으로는 putchar와 같으나 차이점은 문자를 출력할 스트림을 지정할 수 있다는 특징을 가지고 있다. 대부분 파일입출력에 많이 쓰인다.
-
-
문자입력 함수
-
하나의 문자를 입력 받을때 일반적으로 getchar와 fgetc를 사용한다.
- getchar : int getchar() 가 기본형이며 표준입력스트림(대략 키보드)으로부터 한 문자를 입력 받아서 반환해주는 함수이다.
- fgetc : int fgetc(FILE* stream) 가 기본형이며 getchar와 같은 기능이며 문자를 입력받을 스트림을 지정할 수 있다는 특징이다. 파일로부터도 데이터를 입력받을수 있기 때문에 파일입출력에서 많이 쓰인다.
-
- #include <stdio.h>
- int main()
{
char ch = 0;
while(ch != 'q')
{
ch = getchar();
putchar(ch); - }
return 0;
}
- 위의 소스는 getchar와 putchar를 사용한 것이다.
-
EOF에 대해서
- fgetc나 getchar 함수가 파일의 끝에 도달하는 경우에도 EOF가 반환
- #include <stdio.h>
- int main()
{
char ch = 0;
while(ch != EOF)
{
ch = getchar();
putchar(ch); - }
return 0;
}
-
위의 소스에서 EOF 발생 할때 까지 입력 받는다.
- EOF 발생 하려면 ctrl + z or ctrl +c 같은 걸 누르면 된다.
-
문자 단위 입출력 함수가 존재하는 이유!
- 책을 읽어보세요
III. 문자열 단위 입출력 함수
-
문자열 출력함수
- puts : int puts(const char* s)이 함수원형이며 문자열을 표준 출력스트림으로 출력하기 위해 사용하는 함수이다.
- fputs : int fputs(const char* s, FILE* stream)이 함수원형이며 문자열을 출력할 스트림을 선택할수 있으며 puts와 같다.
- #include <stdio.h>
- int main()
{
fputs("fputs 함수에 의한 출력,",stdout);
fputs("I asd",stdout);
fputs("\n",stdout); - puts("puts 함수에 의한 출력,");
puts("i asdf?");
return 0;
}
- 참고로 fputs는 출력을 하는 경우 자동으로 줄바뀜이 안되지만 puts는 자동으로 줄이 바뀌어 진다.
-
문자열 입력 함수
- gets : char* gets(char* s)가 기본형이며 문자열을 입력받는 함수이다. 우선 입력받을 문자열을 저장하기 위한 배열을 선언한다음, 배열의 시작주소를 인자로 전달하면서 gets함수를 호출하게 된다. 다만 이 함수는 사용을 자제 하자
- fgets : char* fgets(char* s,int n, FILE* stream)이 기본형이며, gets와 비슷한 기능을 한다. 입력받을 수 있는 최대 문자열의 길이 n을 초과하는 문자열이 입력되는 경우 n-1개까지의 문자만 입력을 받고 마지막에 NULL 문자를 삽입해 준다.
IV. 표준 입출력과 버퍼
-
표준 입출력 기반의 버퍼
- 표준 입출력 함수를 사용하는 경우에는 버퍼라는 것을 제공받게 된다.
- 버퍼란 여분의 임시 메모리 공간이라고 생각을 하면 된다.
-
버퍼링을 하는 이유는 무엇인가?
- 책참조하세요
-
버퍼를 비우는 작업을 하는 fflush 함수
- fflush : int fflush(FILE* stream)이 함수 원형이며 함수의 인자로 전달되는 스트림의 버퍼를 비워버린다.
- #include <stdio.h>
- int main()
{
char perID[7];
char name[10]; - fputs("주민등록번호 앞 6자리 입력",stdout);
fgets(perID,sizeof(perID),stdin);
fflush(stdin);- fputs("name : ",stdout);
fgets(name,sizeof(name),stdin); - printf("주민등록번호 : %s\n",perID);
printf("이름 : %s\n",name);
return 0;
}
-
fflush를 주석처리 했을때와 안했을 때의 차이를 보면 안했을 때에는 문자가 배열 크기보다 넘어가면 이름을 치지도 못하고 그 넘은 만큼의 문자가 들어가 버린다.
- 이것을 대비하기 위해서 fflush 를 쓴것이다.
V. 문자열 조작함수
-
문자열의 길이를 반환하는 strlen 함수
- strlen : #include<string.h> size_t strlen(const char* s)가 함수 원형이며 인자로 문자열의 포인터를 전달받고 문자열의 길이를 계산하여 반환하되 null은 포함되지 않는다.
- #include <stdio.h>
#include <string.h> - int main()
{
char str[100]; - while(1)
{
fgets(str,sizeof(str),stdin);
printf("길이 : %d\n",strlen(str));
}
return 0;
}
-
위의 소스를 컴파일후 실행시켜 해보았을 때 123 이라 넣으면 4라고 찍히는데 3이 아닌 4일까?
- 이유는 엔터키까지 포함하였기 때문이다.
-
문자열을 복사하는 strcpy와 strncpy 함수
- strcpy 함수 : #include<string.h> char* strcpy(char* dest, const char* src)가 함수 원형이며 dest로 전달된 배열에 src로 전달된 문자열을 복사한다.
- #include <stdio.h>
#include <string.h> - int main()
{
char str1[10] = "12345678";
char str2[10]; - printf("원래 문장 : %s\n",str1);
- strcpy(str2,str1);
- printf("새로운 문장 : %s\n",str2);
return 0;
}
-
strncpy
- #include<string.h> char* strncpy(char* dest, const char* src, size_t n);이 함수 원형이며 strcpy와 같은 기능이며 즉 src로 전달된 문자열을 dest로 전달된 배열에 복사를 한다. 단 복사하는 문자열의 최대 길이는 n을 넘지 않는다.
- #include <stdio.h>
#include <string.h> - int main()
{
char str1[10] = "12345678";
char str2[5]; - printf("원래 문장 : %s\n",str1);
- strncpy(str2,str1,sizeof(str2)-1);
str2[sizeof(str2)-1] = '\0'; - printf("새로운 문장 : %s\n",str2);
return 0;
}
-
문자열을 추가하는 strcat와 strncat
- strcat : #include<string.h> char* strcat(char* dest, const char* src); 가 함수원형이며, src로 전달된 문자열을 첫번째 전달 인자인 dest로 전달된 문자열의 뒤에 추가하는 기능이다.
- strncat : #include<string.h> char* strncat(char* dest, const char* src, size_t n)이 함수 원형이며, strcat과 같은 기능인데 복사 하고자 하는 문자열의 최대 길이를 인자로 전달하는 기능을 더불어 지니고 있다.
- #include <stdio.h>
#include <string.h> - int main()
{
char str1[35] = "Your favorite language is ";
char str2[10];
char *str3 = "12345";
char str4[10]= {0,}; - fputs("What is your favorite computer language ? :",stdout);
fgets(str2,sizeof(str2),stdin); - strcat(str1,str2);
- printf("strcat 생성된 문자열 : %s\n",str1);
strncat(str4,str3,strlen(str3));- printf("strncat 생성된 문자열 : %s\n",str4);
- return 0;
- }
-
문자열을 비교하는 strcmp 그리고 strncmp 함수
- strcmp : #include<string.h> int strcmp(const char* s1, const char* s2);이 함수 원형이며 두 개의 문자열 포인터를 인자로 받아서 포인터가 가리키는 문자열의 내용 비교를 한다.
- strncmp : #include<string.h> int strncmp(const char* s1, const char* s2, size_t n)이 함수 원형이며 strcmp와 같은 기능이며 비교할 문자의 길이를 절달 받아서 비교한다.
- #include <stdio.h>
#include <string.h> - int main()
{
char* str1 = "ABCDase";
char* str2 = "ABCDEFG"; - int result,result1;
result = strcmp(str1,str2);
result1 = strncmp(str1,str2,3);
if (result == 0)
printf("두 문자열은 같다.\n");
else
printf("두 문자열은 다르다.\n");
if (result1 == 0)
printf("두 문자열은 부분적으로 일치\n");
else
printf("두 문자열은 전혀 다르다.\n"); - return 0;
}
-
문자 및 문자열에 관련된 그밖에 함수들
- 문자열을 숫조라 변환하는 함수들
- atoi : #include<stdlib.h> int(long,double) atoi(char *ptr)이 함수 원형이며 문자열을 숫자로 변환해서 리턴해준다.
- #include <stdio.h>
#include <stdlib.h> - int main()
{
char* str1 = "123";
char* str2 = "321"; - printf("123 + 321 : %d\n",atoi(str1)+atoi(str2));
return 0;
}
-
대소문자의 변환을 처리하는 함수들
- toupper : #include<ctype.h> int toupper(int c)이 함수 원형이며 소문자를 대문자로 바꾸어 준다.
- tolower : #include<ctype.h> int tolower(int c)이 함수 원형이며 대문자를 소문자로 바꾸어 준다.
- #include <stdio.h>
#include <string.h>
#include <ctype.h> - void convert(char *str);
- int main()
{
char str[30]; - printf("Enter a string : ");
fgets(str,sizeof(str),stdin); - convert(str);
printf("convert string : %s\n",str); - return 0;
} - void convert(char *str)
{
int i;
for (i=0;i<strlen(str);i++)
{
if (str[i]>65&&str[i]<=90)
str[i] = tolower(str[i]);
else if(str[i]>=97&&str[i]<=122)
str[i] = toupper(str[i]);
else
continue;
}
}
이 글은 스프링노트에서 작성되었습니다.
'2. C/C++ > 01. C' 카테고리의 다른 글
23. 구조체와 사용자 정의 자료형2 (0) | 2008.12.07 |
---|---|
22. 구조체와 사용자 정의 자료형1 (0) | 2008.12.07 |
19. 함수포인터와 void 포인터 (0) | 2008.12.07 |
18. 다차원 배열 그리고 포인터 (0) | 2008.12.07 |
17. 포인터의 포인터 (0) | 2008.12.07 |