본문 바로가기

카테고리 없음

출력함수 정리


printf만이 만능인가?
C언어를 한번 훑었다면 이젠 때에 맞게 다양한 출력함수를 쓸 줄 아는 능력을 기르자.

1) 문자 입,출력함수 - <하나의 문자를 입,출력한다> 

+ 출력함수
* putchar - 전달된 인자를 표준출력스트림(stdout, 모니터)에 출력해준다.
* fputc - 문자를 출력할 스트림을 지정할 수 있어서, 모니터 뿐만 아니라 파일에도 출력할 수 있다.
/*스트림? 스트림이란 컴퓨터와 출력, 입력의 주체(키보드, 모니터) 사이의 데이터의 흐름을 의미한다*/

int putchar(int num);
int fputc(int c, FILE* stream);   // 모니터에 출력하고 싶다면 두번째 인자에 stdout을 입력한다.
/* 문자를 출력하는 함수인데 왜 int형인가? 결국 문자든 숫자든 컴퓨터는 숫자로 연산을 처리하기 때문 */


+ 입력함수
* getchar - 표준입력스트림(stdin, 키보드)로부터 하나의 문자를 입력받는다.
* fgetc - 입력을 받을 스트림을 지정할 수 있어서, 모니터 뿐만 아니라 파일에서도 입력을 받을 수 있다.

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



ex)
char ch;

ch = getchar();  //하나의 문자를 입력받는다
putchar(ch);      //입력받은 하나의 문자를 출력한다


하나의 문자를 받을 때에는 printf 대신 문자 입,출력 함수를 쓰는 습관을 기르자!


2) 문자열 입,출력함수 - <여러 개의 문자를 입,출력한다>

<문자열에 대한 고찰>
문자열이란 무엇인가? 여러 개의 문자를 연속으로 나열한 집합 정도가 되지 않을까?
그렇다면 문자열이란 단어인가? 문장인가? 공백도 엄연한 문자라고 볼 수 있으므로 단어, 문장 모두 문자열이 될 수 있다.
결국 문자열은 함수의 작동원리를 기준으로 함수마다 그 개념이 다르다고 다르다고 하겠다.

scanf는 흔히 가장 많이 쓰이는 입력 함수이다.
그러나 scanf에서의 문자열은? 단어이다.
왜냐하면, scanf는 공백을 기준으로 입력을 받기 때문이다.
즉, 공백을 만나면 하나의 입력이 끝나는 셈이다.

scanf("%s %s %s", &a, &b, &c);
* 사용자의 입력: I am happy

이 경우 a에는 I, b에는 am, c에는 happy가 들어갈 것이다. 공백을 기준으로 하기 때문이다.
그래서 scanf로는 문장을 입력받을 수 없다.
문장을 입력받고 싶다면, 다음에 소개되는 입력함수를 쓰도록 한다. (출력함수 다음에 소개된다)



 +출력함수
* puts - 표준출력스트림으로 출력하는 함수 / 자동으로 개행된다.(줄을 바꿔준다)
* fputs - 출력할 스트림을 지정하여 출력할 수 있는 함수 / 개행되지 않는다.
-> printf를 쓰면서 맨날 \n을 써주는 것을 까먹는 나같은 놈들한테 유용한 함수이다.

int puts(const char* s);
int fputs(const char*s, FILE* stream);



puts("룰루랄라");
fputs("꼬꼬면은 ", stdout)
fputs("맛있어", stdout)

/* 출력결과 */
룰루랄라
꼬꼬면은 맛있어



+입력함수
* fgets - 출력할 스트림을 지정하여 출력할 수 있는 함수

char* fgets(char* s, int n, FILE* stream);

함수의 인자가 포인터, 즉 주소를 전달해야 하고 문자열 특성상 단일변수는 힘드므로
배열을 전달하는 것이 맞다. (배열의 이름은 그 배열의 주소를 의미한다)


#include <stdio.h>

int main(void)
{
char str[5];

fputs("입력: ", stdout);
fgets(str, sizeof(str), stdin);   //sizeof(str)은 배열 str의 크기를 의미한다. int형 정수를 넣어도 된다

fputs("출력: ", stdout);
fputs(str, stdout); 

return 9; 


/* 출력결과 */
입력: 123
출력: 123

입력: 1234567
출력: 1234

입력: 일이삼사오
출력: 일이삼사?
/* '오'는 출력이 안된다. 한글은 2byte이므로 총 10byte가 필요한데 마지막 2byte중 1byte는 null문자가 차지한다*/

첫번째 결과는 입력한대로 나와서 문제가 없지만,
두번째 결과는 심지어 배열크기 5만큼도 출력되지 않았다.
fgets 함수는 문자열을 입력받는 함수인데, 문자열은 문자열 맨 끝 공간에 null이 들어가야 하므로
무조건 n-1개만큼의 문자만 입력받게 되어있다. 그 이상으로 넘치는 입력값들은 받지 않는다. 


다른 함수들은 다음에 업데이트할 예정!