문자와 문자열 관련 함수

NOAH·2021년 3월 3일
0

입출력

입출력 장치는 매우 포괄적이다. 데이터를 컴퓨터 내부로 받아들이는 것이 입력이고 외부로 전송하는 것이 출력이다.

데이터의 입출력이 가능한 이유는 출력의 경로가되는 입력의 경로가 되는 스트림이 존재하기 때문이다.콘솔의 입출력을 위한 스트림은 프로그램이 시작되면, OS에서 자동으로 시작된다. 스트림이란, 데이터의 입출력을 위해 놓아주는 소프트웨어적인 형태의 다리

데이터의 이동 수단이 되는 스트림

데이터의 입 출력이 가능한 이유!

콘솔 입출력을 위한 스트림은 프로그램이 시작되면 OS에 의해서 자동으로 생성된다.

출력의 경로가 되는 출력 스트림과 입력의 경로가 되는 입력 스트림이 존재하기 때문이다.

스트림의 생성과 소멸

스트림은 흐름. 스트림이라고 불리는 이유는 데이터의 이동을 한 방향으로만 형성하기 때문이다. 물이 한 방향으로 흐르듯 스트림도 한 방향으로만 데이터가 이동한다.

stdin(표준 입력 스트림) : 키보드 대상으로 입력
stdout(표준 출력 스트림) : 모니터 대상으로 출력
stderr(표준 에러 스트림) : 모니터 대상으로 출력

세 가지 모두 프로그램 시작과 동시에 자동으로 형성되고 프로그램 종료시 자동으로 소멸된다. 이외의 스트림들은 프로그래머가 직접 형성해야 한다. 예를 들어 파일 입출력을 위한 스트림은 직접 형성해야 한다.

  • 출력 리다이렉션이라느 것을 통해서 stdout과 stderr이 향하는 데이터의 전송의 방향을 각각 달힐 할 수 있다.

하나의 문자를 출력하는 두 함수

#include <stdio.h>

int putchar(int c);
// putchar 함수는 인자로 전달된 문자를 모니터에 출력한다.
int fputc(int c, FILE *stream);
// fputc 함수의 두 번째 인자를 통해서 출력의 대상을 지정.

두 함수는 기능은 같다.
함수 purchar은 출력의 대상이 모니터로 지정되 있고, fputc함수는 두번째 매개변수를 통해 출력의 대상을 정할 수 있다.

하나의 문자를 입력받는 두 함수


#include <stdio.h>
int getchar(void); 
//키보드로 입력된 문자의 정보를 반환
int fgetc(FILE *stream); 
// 문자를 입력 받을 대상 정보를 인자로 전달

getchar 함수와 fgetc 함수 관계는 putchar 함수와 fputc함수의 관계와 같다.

파일의 끝에 도달하거나 함수호출 실패시 EOF로 반환한다.

EOF? -1!

  • EOF란 파일의 끝(Endof file)의 약자로서, 파일의 끝을 표현하기 위해서 정의해 놓은 상수.

  • 파일을 대상으로 fgetc'함수가 호출 되었을 때' 끝에 도달하면 EOF반환

  • 함수 호출 실패 시 반환.

  • 윈도우에서 컨트롤 + z 혹은 리눅스에서 컨트롤 + d 입력시 반환

예제에서 보이듯이, 하나의 문장이 입력되어도 문장을 이루는
모든 문자들이 반복된 getchar 함수의 호출을 통해서 입력될 수 있다.


int main(void)
{
	int ch;
    while(1)
    {
    ch = getchar(); 
    //키보드에 입렵된 문자를 ch변수에 초기화
    if(ch == EOF)
    // EOF 반환시
    break;
    // 반복문에서 나오기
    putchar(ch);
    // ch변수의 값을 모니터에 출력
    }
	return 0;    
}

반환형이 int이고, int 형 변수에 문자를 담는 이유는?

int getchar(void);
int fgetc(FILE *stream);

의외로 답이 간단하다.. EOF는 그 값이 -1 로 저장되어 있는 상수이기 때문에 경우에 따라서, EOF가 반환되면 -1이 된다.

int 는 signed int 와 unsigned int 가 두 종류 가 있는데, 기본적으로 양수 음수를 모두 처리할 수 있는 signed int로 컴파일러는 인식을 합니다.

char 자료형은 unsigned char 로 표현하는 컴파일러가 존재하는데, 그러며 프로그램에 오류가 발생한다.

만일의 경우라도 오류가 발생할 소스는 바람직하지 못하기에
컴파일러가 signed int로 처리하여 따라서 -1의 반환에 무리가 없는 int type을 쓴다.

문자열 길이를 반환하는 함수 strlen

#include <stdio.h>
#include <string.h>

int main()
{
	size_t strlen(const char* s);
//전달된 문자열의 길이를 반환 하되,널 문자는 길이에 포함하지 않는다.

	char str[] = "1234567"; 
	printf("%u \n", strlen(str));
    // 문자열의 길이 7 을 출력
	
}

7


fgets함수호출을 통해서 문자열을 입력 받고 싶은데, 같이 딸려서 들어오는 \n 문자는 문자열에서 제외하고 싶다.

#include <stdio.h>
#include <string.h>


void RemoveBSN(char str[])
{
	int len = strlen(str);
	str[len - 1] = 0; //마지막 자리에 아스키 코드 0

//마지막 자리는 엔터가 입력된 자리이므로 문자열에서 개행문자는 사라진 셈.
}


int main()
{
	char str[100];
	printf("문자열 입력 : ");
	fgets(str, sizeof(str), stdin);
// stdin으로부터 문자열을 입력받아, sizeof(str)의 길이 만큰 str에 저장
	printf("길이 : %d, 내용 : %s \n", strlen(str), str); 
    // 엔터포함
	RemoveBSN(str);
	printf("길이 : %d, 내용 : %s \n", strlen(str), str); 
    // 엔터삭제

	return 0;

	
}

문자열 입력 : 123456
길이 : 7, 내용 : 123456
길이 : 6, 내용 : 123456

0개의 댓글