728x90
문자 입출력 라이브러리 함수
Ex1. getchar(), putchar()
#include <stdio.h>
int main(void){
int ch; // 리턴 표준이 정수형임을 주의!
int cnt = 0;
// EOF 입력은 Ctrl + Z로 가능하다!
while((ch = getchar()) != EOF)
{
putchar(ch);
printf("<%d> \n", cnt++);
}
return 0;
}
💡 키보드 입력은 버퍼에 쌓이고
엔터 입력은 프로그램에 전달된다. (다음 단계 수행)
Ex2. _getch(), _putch()
#include <stdio.h>
#include <conio.h> // _getch(), _putch()가 포함된 헤더
int main(void){
int ch; // 리턴 표준이 정수형임을 주의!
int cnt = 0;
while((ch = _getch()) != 'q')
{
_putch(ch);
printf("<%d> \n", cnt++);
}
return 0;
}
💡 버퍼를 사용하지 않아, 키보드 입력이 발생되는 즉시 화면에 출력된다.
(사용자의 입력이 화면에 표시되지 않음)
_getch(), _getche(), getchar()
💡 _getche() 를 사용하면 키보드 입력이 화면에 표시되고 응답속도 또한 getch() 처럼 빠르게 처리된다.
문자열 입출력 라이브러리 함수
💡 문자열 입력은 버퍼를 반드시 사용한다!
└ (문자열의 끝을 알아야하기 때문에)
Ex3. gets_s(), puts()
#include <stdio.h>
int main(void) {
char name[100];
char address[100];
printf("이름을 입력하시오.\n");
gets_s(name, 100);
printf("현재 거주하는 주소를 입력하시오.\n");
gets_s(address, 100);
puts(name);
puts(address);
return 0;
}
문자 처리 라이브러리 함수
- <ctype.h> 파일내에 포함되어있다.
Ex4. Word_Counter.c
#include <stdio.h>
#include <ctype.h>
int count_word(char *s){
int i, wordcount = 0, waiting = 1;
// waiting을 flag 변수로 사용
for(i = 0; s[i] != '\0'; ++i)
if(isalpha(s[i])) {
if(waiting){
wordcount++;
waiting = 0;
}
}
else
waiting = 1;
return wordcount;
}
int main(void){
int wordcount = count_word("Enjoy C Programming...!");
printf("단어의 개수 : %d\n", wordcount);
return 0;
}
문자열 처리 라이브러리
<string.h> 파일내에 포함되어있다.
strcpy()
- 헤더파일 : <string.h>
- 함수원형 : char* strcpy(char* dest, const char* origin);
- 내용 : origin 에 있는 문자열 전체를 dest 로 복사한다.
💡 strcpy 🆚 strncpy
- strcpy를 사용할 경우 버퍼의 사이즈에 상관없이 문자열을 복사하므로 보안에 취약점이 발생한다.
- strncpy를 사용하면 복사 이전에 버퍼의 사이즈가 충분한지 검사하기 때문에 비교적 보안 위험성이 적다.
✔ 다른 함수들도 동일 원리!!
strcat()
- 헤더파일 : <string.h>
- 함수원형 : char* strcat(char* dest, const char* origin);
- 내용 : origin 에 있는 문자열 전체를 dest 뒤쪽에 이어 붙인다.
Ex5. strcpy(), strcat()
#include <stdio.h>
#include <string.h>
int main(void){
char string[80];
strcpy( string, "Hello world from " );
strcat( string, "strcpy " );
strcat( string, "and " );
strcat( string, "strcat!" );
printf( "string = %s\n", string );
return 0;
}
Ex6. strcpy() 🆚 strncpy()
#include <stdio.h>
#include <string.h>
int main(void)
{
char ORG[15] = "Hello World";
char DEST1[10];
char DEST2[15] = "01234567890123";
char DEST3[20] = "0123456789012345678";
printf("ORG = %s \n", ORG);
// case.1 : 작은 크기의 배열에 복사할 때
strcpy(DEST1, ORG); printf("DEST1=%s \n", DEST1);
// case.2 : 같은 크기의 배열에 복사할 때
strcpy(DEST2, ORG); printf("DEST2=%s \n", DEST2);
// case.3 : 큰 배열에 복사할 때
strcpy(DEST3, ORG); printf("DEST3=%s \n", DEST3);
printf("\n");
return 0;
}
📢 ERROR 발생
정해진 크기보다 큰 문자열을 복사하려고 하면 오류가 발생한다!
#include <stdio.h>
#include <string.h>
int main(void)
{
char ORG[] = "Hello World";
char DEST1[20];
char DEST2[] = "AbCdEfGhIjKlMnOp";
char DEST3[] = "StrNCpy_Example";
char DEST4[10] = "";
printf("ORG = %s %d\n", ORG, sizeof(ORG));
// case.1 : 빈 배열에 전체를 복사할 때
strncpy(DEST1, ORG, sizeof(ORG)); printf("DEST1=%s \n", DEST1);
// case.2 : 꽉찬 배열에 전체를 복사할 때
strncpy(DEST2, ORG, sizeof(ORG)); printf("DEST2=%s \n", DEST2);
// case.3 : 꽉찬 배열에 일부만 복사할 때
strncpy(DEST3, ORG, 4); printf("DEST3=%s \n", DEST3);
// case.4 : 빈 배열에 일부만 복사할 때
strncpy(DEST4, ORG, 4); printf("DEST4=%s \n", DEST4);
printf("\n");
return 0;
}
strcmp()
- 리턴값 : (s1의 아스키코드 값) - (s2의 아스키코드 값)
Ex7. strcmp()
#include <string.h>
#include <stdio.h>
int main( void ) {
char s1[80]; // 첫번째 단어를 저장할 문자배열
char s2[80]; // 두번째 단어를 저장할 문자배열
int result;
printf("첫번째 단어를 입력하시오:");
scanf("%s", s1);
printf("두번째 단어를 입력하시오:");
scanf("%s", s2);
result = strcmp(s1, s2);
if( result < 0 )
printf("%s가 %s보다 앞에 있습니다.\n", s1, s2);
else if( result == 0 )
printf("%s가 %s와 같습니다.\n", s1, s2);
else
printf("%s가 %s보다 뒤에 있습니다.\n", s1, s2);
return 0;
}
strchr()
- 헤더파일 : <string.h>
- 함수원형 : char* strchr(const char* str, int c);
- 내용 : 첫 번째 매개변수 (char* str) 에서 두 번째 매개변수 (int c) 아스키 코드 값을 찾아서, 해당 문자가 있는 포인터를 반환한다.
Ex8. strchr()
#include <string.h>
#include <stdio.h>
int main(void)
{
char str[] = "Hello World!";
char *ptr;
char c = 'o';
printf(" '%s' 에서 '%c' 를 찾으시오. \n\n", str, c);
ptr = strchr(str, c);
if (ptr == NULL)
printf("찾는 문자 '%c' 가 해당 문자열에 없습니다. \n", c);
else
while (ptr != NULL)
{
printf(" 찾는 문자 '%c' 가 %2d 번 자리에서 발견되었습니다.\n",
*ptr, (ptr - str) + 1);
ptr = strchr(ptr + 1, c);
}
return 0;
}
strstr()
- 헤더파일 : <string.h>
- 함수원형 : char* strstr(char* str1, const char* str2);
- 내용 : 첫 번째 매개변수 (char* str1) 에서 두 번째 매개변수 (const char* str2) 와 일치하는 문자열을 찾아서, 해당 문자가 있는 포인터 (char*)를 반환한다. 찾지 못하면 NULL 을 반환한다.
Ex9. strstr()
#include <string.h>
#include <stdio.h>
int main(void)
{
char s[] = "What a wonderful world!";
char sub[] = "wonderful";
char *p;
int loc;
p = strstr(s, sub);
loc = (int)(p - s);
printf(" %s 에서 %s 를 찾으시오. \n\n", s, sub);
if (p != NULL)
printf(" 첫 번째 %s가 %d 번째 자리에서 발견되었습니다.\n", sub, loc);
else
printf(" 찾는 문자열 \"%s\"가 해당 문자열에 없습니다.\n", sub);
return 0;
}
아래 노션 페이지에 C 공부 내용에 대해 업로드 합니다!
수정사항이나 질문사항의 경우 노션 댓글로 남겨주세요!(*•̀ᴗ•́*)و ̑̑
개발 환경
작성 플랫폼
728x90
'🧑💻 Language > C·C++' 카테고리의 다른 글
[C 이론] 16. 파일 입출력 (1) | 2021.06.22 |
---|---|
[C 이론] 15. 표준 입출력 (0) | 2021.06.22 |
[C 이론] 13. 문자와 문자열(1) (0) | 2021.06.05 |
[C 이론] 12. 포인터(2) (0) | 2021.06.01 |
[C 이론] 11. 포인터(1) (0) | 2021.06.01 |