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;
}

 

 

 

 

 


 

 

문자와 문자열(2)

문자 입출력 라이브러리 함수

www.notion.so

 

아래 노션 페이지에 C 공부 내용에 대해 업로드 합니다!

수정사항이나 질문사항의 경우 노션 댓글로 남겨주세요!(*•̀ᴗ•́*)و ̑̑

 

 

 

C 언어 이론 정리

조건문, 반복문 사용 시 중괄호로 명령문들 묶어주기 - 명령문 1개일 때 포함 (코드 수정 시 오류 방지)

www.notion.so

 


 

개발 환경

Visual Studio 2019
Visual Studio Code

작성 플랫폼

Notion

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