본문 바로가기
코스웨어/15년 스마트컨트롤러

2015-03-31 업무일지 출석번호 10번 김태현 문자, 문자열 단위 입출력 함수

by 알 수 없는 사용자 2015. 3. 31.
728x90
반응형

putchar 함수의 이해


int putchar(int);

putchar(아스키코드);
//puhchat에 아스키코드를 치면 해당하는 문자로 바꿔준다 c에서는 'A'와 같이 적어주면 컴파일러가 아스키코드로 바꿔준다.

return putchar(아스키코드, stdiout); putchar를 쓰면 앞의 소스를 호출해서 바꿔준다.

int putchar(65)랑 아래의 소스랑 똑같은 것이다.
putchar는 반환값이 해당하는 문자의 아스키코드이다.

#include<stdio.h>
int main()
{
     smart(65);
     return 0;
}

int smart(int ichar)
{
     return fputc(ichar, stdout);    
}


결과





void smart(int, ...);
가변인자를 사용하고 싶으면 인자가 하나는 있어야한다.
...은 (int, int , ...)처럼 무조건 맨오른쪽에 있어야한다.
※어길시 컴파일이 안됨


putchar와 getchar의 차이점

#include<stdio.h>

int main(void)
{
  int iNum1;
  int iNum2;

  iNum1=putchar('A');
  iNum2=putchar('\n');

  printf("%d\n",iNum1);
  printf("%d\n",iNum2);

  iNum1=getchar();
  //키보드의 단순한 아스키코드만 입력받는다 그리고 한글자밖에 입력못받는다

  printf("%d\n",iNum1);

  iNum2=fgetc(stdin);

  printf("%d\n",iNum1);

  printf("EOF=%d입니다", EOF);

  return 0;
}


결과





putchar의 return 값은 입력된 문자의 아스키코드인것을 알수있다.

getchar는 단순히 아스키코드만 입력받기 때문에 한글자만 입력받을수 있다.

EOF는 End Of File의 약자이고 -1이 define되어있고 파일의 끝은 -1로 표시해준다.





함수 중간의 입력란에서 CTRL + Z를 누르면 실행이 종료되고 -1이 되면서 파일을 종료한다.



printf("Hi~\n"); 에서 ""가 의미하는 것은 무엇인가.


'H' 'i' '~' '\t char*로n' '0'로 이루어져있는데.

이건 우리가 정해준게 아니고 어딘가 존재하는 상수이다.

int printf ( const char * , ... );

//printf의 함수원형이다



puts, fputs 와 gets, fgets


puts 와 fputs는 문자열을 출력하는 함수이다.



#include<stdio.h>

int main(void)
{
  char * str="Simple String";

  printf(". puts test ------ \n");
  puts(str);
  puts("So Simple String");

  printf("2. fputs test ----- \n");
  fputs(str, stdout); printf("\n");
  fputs("So Simple String", stdout); printf("\n");

  printf("3. end of main ----\n");
  return 0;
}


결과




puts 함수가 호출되면 문자열 출력 후 자동으로 개행이 이뤄지지만, fputs 함수가 호출되면 문자열 출력 후 자동으로 개행이 이뤄지지 않는다


gets 와 fgets는 문자열을 입력하는 함수이다.

scanf는 띄어쓰기가 불가능 했지만 gets와 fgets는 가능하다

#include <stdio.h>

int main(void)
{
  char str[7];
  int i;

  for(i=0; i<3; i++)
  {
    fgets(str, sizeof(str), stdin);
    printf("Read %d: %s \n", i+1, str);
  }
  return 0;
}
결과




gets를 사용하면 문장구성은 간단하지만 미리 정해놓은 배열을 넘어서는 길이의 문자열이 입력되면,

할당 받지 않은 메모리 공간을 침범하여 실행중 오류가 날수 있다.


그렇기 때문에 아래와 같이 fgets를 써준다.

fgets(str, sizeof(str), stdin);

위의 소스를 해석하면 stdin으로부터 문자열을 입력 받아서 배열 str에 저장하되,

sizeof(str)의 길이만큼만 저장해라 라는 의미랑 같다.


그래서 결과를 보면 str[7]을 주었기 때문에 null을 뺀 6자리를 사용해서 6까지만 출력하고

두번째 공간에 789를 저장한다.




#include<stdio.h>

int main(void)
{
  int iNum;
  char cNum[5];

  //printf("반드시 숫자 세자리를 입력하세요");
  //fgets(cNum, sizeof(cNum), stdin);

  //iNum=(cNum[0] - '0')*100 + (cNum[1] - '0')*10 +(cNum[2] - '0');

  //printf("%d",iNum);
  
  //문자열을 숫자로 만드는과정

  iNum = 123;

  cNum[0= '0' + iNum / 100;
  cNum[1= '0' + (iNum % 100) / 10;
  cNum[2= '0' + (iNum % 10); 
  cNum[3= 0;

  putchar(cNum[0]);
  putchar(cNum[1]);
  putchar(cNum[2]);
  putchar('\n');
  putchar(cNum[3]);

  //숫자를 문자열로 만드는과정

  return 0;
}


위의 소스는 숫자를 문자열로 만드는과정과

문자열을 숫자로 만드는과정이다

ATmega의 charLCD같은 경우는 아스키 코드로만 표현이 가능하기 때문에 글자를 아스키코드로 변환하는과정이 필요하다.


scanf의 경우 이러한 과정을 한번에 처리해준다(scanf는 위대했다!!)




Buffer


Buffer는 데이터의 효율적인 관리를 위해서 존재한다.

운영체제는 우리가 짠 프로그램에 데이터를 전송할때 메모리 버퍼라는 임시 저장공간을 가지고 있다.

버퍼가 정해놓은 만큼의 용량이 차면 혹은 엔터를 눌러주면 프로그램으로 데이터를 전송한다.

윈도우OS는 \n 개행문자를 안적어줘도 printf같은 경우는 출력이 되지만

다른 운영체제는 개행문자를 입력하지 않으면 아무것도 출력되지 않으므로 꼭 개행문자를 붙여줘야한다.


fflush(stdout); 출력버퍼를 비우면 모아둔 데이터를 프로그램으로 전송시킨다.


fflush(stdin); 입력버퍼를 비우면 적었던 것들을 전부다 날린다.


#include <stdio.h>

void ClearLineFromReadBuffer(void)
{
  while(getchar()!='\n');
}


int main(void)
{
  char perID[7];
  char name[10];

  fputs("주민번호 앞 6자리 입력: ",stdout);
  fgets(perID, sizeof(perID), stdin);
  
  ClearLineFromReadBuffer();
  //입력되고 남은 데이터들은 Clear 함수에서 다 버려버린다.
  //입력 버퍼를 비워준다.
  
  fputs("이름 입력: ", stdout);
  fgets(name, sizeof(name), stdin);

  printf("주민번호: %s \n", perID);
  printf("이름: %s \n", name);
  return 0;
}

위의 소스에서 while 문을 넣어줌으로서 개행문자와 같으면 입력버퍼를 비워줌으로



perID의 크기에 맞는 데이터만 넣어주고

엔터가 나오기 전까지의 쓸모없는 데이터들은 비워줘서

이름 입력시의 버퍼를 깨끗하게 만들어준다.






모두들 오늘 하루도 고생많이 하셨습니다

728x90