윤성우저열혈강의 C 프로그래밍개정판 Chapter 21. 문자와문자열관련함수
Chapter 21-1. 스트림과데이터의이동 윤성우저열혈강의 C 프로그래밍개정판
무엇이입력이고무엇이출력인가 입력장치 출력장치 키보드 마우스 화상카메라 파일 모니터 프린터 입출력장치는매우포괄적이다. 데이터를컴퓨터내부로받아들이는것이입력이고외부로젂송하는것이출력이다.
데이터의이동수단이되는스트림 콘솔입출력을위한스트림은프로그램이시작되면 OS 에의해서자동으로생성된다. 데이터의입출력이가능한이유! 출력의경로가되는출력스트림과입력의경로가되는입력스트림이존재하기때문 입출력스트림이란? OS 가데이터의입출력을위해놓아주는소프트웨어적인형태의다리!
스트림의생성과소멸 stdin과 stdout은각각표준입력스트림과표준출력스트림을의미하는이름들이다. stderr은표준에러스트림이라하며, 출력의대상은 stdout과마찬가지로모니터이다. 출력리다이렉션이라는것을통해서 stdout과 stderr이향하는데이터젂송의방향을각각달리할수있다. stdin, stdout, stderr은모두프로그램시작과동시에자동으로형성되고프로그램종료시자동으로소멸된다. 이외의스트림들은프로그래머가직접형성해야한다. 예를들어파일입출력을위한스트림은직접형성해야한다. 스트림이라불리는이유는데이터의이동을한방향으로만형성하기때문이다. 물이한방향으로흐르듯 스트림도 ( 스트림은물의흐름을의미함 ) 한방향으로만데이터가이동한다.
Chapter 21-2. 문자단위입출력함수 윤성우저열혈강의 C 프로그래밍개정판
문자입출력함수 하나의문자를출력하는두함수 putchar 함수는인자로전달된문자를모니터에출력한다. fputc 함수의두번째인자를통해서출력의대상을지정한다. fputc 의두번째인자로 stdout 이젂달되면이 putchar 함수와동일한결과를보인다. 하나의문자를입력받는두함수 키보드로입력된문자의정보를반환한다. 문자를입력받을대상정보를인자로전달한다. getchar 함수와 fgetc 함수의관계는 putchar 함수와 fputc 함수의관계와같다.
문자입출력관련예제 문자의입력을완성하는엔터키의입력도하나의문자로인식이된다. 따라서이역시도입출력이가능하다. 실행결과 첫번째 P 는입력이된 P, 두번째 P 는출력된 P 문자를 int 형변수에저장하는이유는 EOF 를설명하면서함께설명한다.
문자입출력에서의 EOF EOF의의미 EOF는 End Of File의약자로서, 파일의끝을표현하기위해서정의해놓은상수이다. 파일을대상으로 fgetc 함수가호출되었을때파일에끝에도달을하면 EOF가반환된다. 콘솔대상의 fgetc, getchar 함수호출로 EOF를반환하는경우 함수호출의실패 Windows에서 Ctrl+Z 키, Linux에서 Ctrl+D 키가입력이되는경우 키보드에는 EOF 가존재하지않는다. 따라서 EOF 를 Ctrl+Z 키와 Ctrl+D 키로약속해놓은것이다. 예제에서보이듯이. 하나의문장이입력되어도 문장을이루는모든문자들이반복된 getchar 함수의호출을통해서입력될수있다. 실행결과
반환형이 int 이고, int 형변수에문자를담는이유는? 반환형이 char 형이아닌 int 형인이유는? char형은예외적으로 signed char가아닌 unsiged char로표현하는컴파일러가존재한다. 파일의끝에도달했을때반환하는 EOF는 -1로정의되어있다. char를 unsigend char로표현하는컴파일러는 EOF에해당하는 -1을반환하지못한다. int는모든컴파일러가 signed int로처리한다. 따라서 -1의반환에무리가없다.
Chapter 21-3. 문자열단위입출력함수 윤성우저열혈강의 C 프로그래밍개정판
문자열출력함수 : puts, fputs 인자로젂달되는문자열을출력한다. 단 fputs 함수는두번째인자를통해서출력의대상을지 정할수있다. puts 함수가호출되면문자열출력후자동으로개행이이뤄지 지만, fputs 함수가호출되면문자열출력후자동으로개행이 이뤄지지않는다는사실에주목! 실행결과
문자열입력함수 : gets, fgets 이경우입력되는문자열의길이가배열을넘어설경우 할당받지않은메모리를참조하는오류가발생한다. stdin 으로부터문자열을입력받아서 str 에저장을하되, 널문자를포함하여 sizeof(str) 의크기만큼저장을해라.
fgets 함수의호출의예 실행결과 1 6 개의문자씩끊어서읽히고있다. 즉, 한번의 fgets 함수호출당최대 6 개의문자만읽혀진다. 엔터 실행결과2 엔터실행결과3 엔터 엔터키의입력도문자열의일부로 받아들임을보임 엔터 공백을포함하는문자열을읽어들임 을보임 엔터 엔터
Chapter 21-4. 표준입출력버퍼 윤성우저열혈강의 C 프로그래밍개정판
표준입출력기반의버퍼와버퍼링의이유 입출력버퍼 버퍼는특정크기의메모리공갂을의미한다. 운영체제는입력과출력을돕는입출력버퍼를생성하여제공한다. 표준입출력함수를기반으로데이터입출력시입출력버퍼를거친다. 입출력버퍼에데이터가젂송되는시점 호출된출력함수가반환이되는시점이출력버퍼로데이터가완젂히젂송된시점이다. 엔터를입력하는시점이키보드로입력된데이터가입력버퍼로젂달되는시점이다. 버퍼링을하는이유는데이터이동의효율과관련 이있다. 데이터를모아서전송하면, 하나씩전송 하는것보다효율적이다.
출력버퍼를비우는 fflush 함수 인자에해당하는출력버퍼를비운다. 출력버퍼를비운다는것은출력버퍼에저장된데이터를지우는것이아니라, 출력버퍼에저장된데이터를목적지로최종젂송함을뜻한다. fflush(stdout) 출력버퍼를지워라! 출력버퍼의경우와달리입력버퍼의비움은입력버퍼에저장된데이터의소멸을뜻한다. 그리고 fflush 함수는출력버퍼를대상으로정의된함수이다. 따라서 fflush(stdin) 과같 은형태의함수호출은그결과를보장받지못한다. 그렇다면입력버퍼는어떻게비워야할까?
입력버퍼는어떻게비워야하나요? 주민번호앞 6 자리만입력받기위해서배열의 길이가널문자포함 7 이다. 입력버퍼를 비우는함수 실행결과 1 엔터키가남아서문제가되는상황 실행결과 2 말안듣는사람들때문에문제되는상황 어떠한경우에도주민번호 6 자리만입력받도록재구현된예제
Chapter 21-5. 입출력이외의문자열관련함수 윤성우저열혈강의 C 프로그래밍개정판
문자열의길이를반환하는함수 : strlen size_t 의일반적인선언 typedef unsigned int size_t; typedef 에관해서는후에설명 마지막에삽입되는 널문자를없애는예제 실행결과
문자열을복사하는함수들 : strcpy, strncpy 대표적인문자열복사함수 str1 에저장된문자열을 str2 에단순히복사! strcpy 함수를호출하는경우배열의범위를넘어 서복사가진행될위험이있다. str1 에저장된문자열을 str2 에복사하되최대 sizeof(str2) 의반환값크기만큼복사한다.
strncpy 함수를잘못사용한예 배열길이 str1 에딱맞는길이만큼만복 사를하겠다는의도의문장실행결과 두번째 strncpy 함수호출후의결과에이상이보이는이유는복사하는과정에서문 자열의끝을의미하는널문자가복사되지않았기때문이다. 문자열을복사할때에는 항상널문자의복사까지고려해야한다.
문자열을덧붙이는함수들 : strcat, strncat strncat 함수는덧붙일문자열의 최대길이를제한한다. 최대 n 개의문자를덧붙이되널문자포함하여 n+1 개의문자를덧붙인다. 덧붙여지는방식 실행결과
문자열을비교하는함수들 : strcmp, strncmp strncmp 는최대 n 개의문자를비교 크고작음은아스키코드값을근거로한다. A 보다 B 가, B 보다 C 가아스키코드값이더크고 A 보다 a 가, B 보다 b 가아스키코드값이더크니, 사젂편찬순서를기준으로뒤에위치할수록더큰문자열로인식해도된다. 0 보다큰값이출력 0 보다작은값이출력 두문자열이같으면 0, 다르면 0 이아닌값을반환한다고인식하고있어도충분하다!
문자열비교의예 실행결과
그이외의변환함수들 헤더파일 stdlib.h 에선언 위의함수들을모른다면문자열에저장된숫자정보를 int 형또는 double 형으로변환하는일은번거로운일이될수있다. 실행결과
Chapter 21 이끝났습니다. 질문있으신지요?