Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

heenam

chapter 21 문자와 문자열 관련 함수 본문

[Programming Language]/C

chapter 21 문자와 문자열 관련 함수

znzltiq 2020. 4. 2. 21:49

스트림과 데이터의 이동

  스트림 : 프로그램상에서 모니터와 키보드를 대상으로 데이터를 입출력 하기 위해 연결시켜 주는 다리

문자 단위 입출력 함수

 문자 출력 함수: putchar, fputc

  putchar 함수는 인자로 전달된 문자정보를 stdout으로 표현되는 표준 출력 스트림이다.

  따라서 인자로 전달된 문자를 모니터로 출력하는 함수

  fputc 함수는 putchar 함수와 동일하다. 단 fputc 함수는 문자를 전송할 스트림을 지정할 수 있다.

#include <stdio.h>

int main()
{ //putchar fputc 둘다 문자 하나만 출력 가능
    putchar('A'); // putchar 함수는 ' '사이에 문자 하나 넣으면 출력 가능
    putchar('\n');

    fputc('a',stdout); // fputc함수는 뒤에 stdout 스트림을 붙여 모니터에 출력하라는 명령을 해야함
    putchar('\n');
}
// 따라서 이 코드를 출력 하게 되면
A
a
//값이 나옴

 문자 입력 함수: getchar, fgetc

  getchar 함수는 stdin으로 표현되는 표준 입력 스트림으로부터 하나의 문자를 입력 받아서 반환하는 함수이다.

  따라서, 키보드로부터 하나의 문자를 입력 받는 함수라 할 수 있다.

  fgetc 함수도 하나의 문자를 입력 받는 함수이지만 문자를 입력 받을 스트림을 지정할 수 있다.

#include <stdio.h>

int main()
{ // getchar함수 문자 하나만 입력받을 수 있음

	char b_type;
    
	printf( " 당신의 혈액형은 : ");
	b_type = getchar(); //getchar 함수에 문자 하나 입력 받아 b_type변수에 저장
	printf(  "\n %c형이군요. 반갑습니다. \n", b_type ); // b_type에 저장된값 출력
	
 }

 문자 입출력에서의 EOF

  EOF : 파일의 끝을 표현하기 위해서 정의해 놓은 상수

  함수호출를 실패하거나 windows에서 CTRL+Z키, Linux에서 CTRL+D키가 입력되는 경우 EOF를 반환함

 

문자열 단위 입출력 함수

 문자열 출력 함수: puts, fputs

  puts 함수는 출력의 대상이 stdout으로 결정되어 있지만, fputs 함수는 두번째 인자를 통해서 출력의 대상을 결정할

  수 있다.

#include <stdio.h>

int main()
{
	fputs('a\n',stdout); // 자동으로 줄바꿈이 안되므로 줄바꿈을 할땐 \n을 붙여야됨
    
	puts('A'); \\ 자동 줄바꿈 가능
    
}
// 출력하면
a
A
//가 출력됨

문자열 입력 함수: gets, fgets

#include <stdio.h>

int main()

{
    char name[10];

    printf("What is your name? ");
    gets(name); // gets 함수를 사용할 경우 변수명만 적으면 됨
    fgets(name, 10, stdin); 
    // fgets함수를 사용할 경우 변수명, 문자열의 길이, 입력받을 스트림 순으로 적으면됨
    printf("Your name is %s", name);
}
// 출력할 경우 둘다 같은 모양으로 출력되지만 fgets함수같은 경우 문자끝에 '\0'도 포함 하여 계산되니 참고!
// 공백도 함께 입력 받고 싶을때 유용하게 쓰임!!!

 

표준 입출력과 버퍼

 표준 입출력 기반의 버퍼

  데이터들은 운영체제가 제공하는 '메모리 버퍼'를 중간에 통과 하게 된다. 

  메모리 버퍼 : 데이터를 임시로 모아두는 메모리 공간

 버퍼링을 하는 이유는 무엇인가?

  버퍼링 없이 키보드가 눌릴 때마다 눌린 문자의 정보를 목적지로 바로 이동시키는 것보다 중간에 메모리 버퍼를

  뒤서 데이터를 한데 묶어서 이동시키는 것이 보다 효율적이고 빠르다.

 출력버퍼를 비우는 fflush 함수

  시스템에 때라 출력버퍼가 비워지는 시점이 다름

  fflush 함수를 호출하면 어떠한 표준 출력버퍼라 할지라도 출력버퍼에 저장된 데이터가 버퍼를 떠나서 목적지로 이동됨

 입력버퍼는 어떻게 비워야 하나요?

  fflush(stdin); 을 이용해 비울 수 있음

 

입출력 이외의 문자열 관련 함수

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

  문자의 길이를 구할때 쓰는 함수 사용전에 #include <string.h>을 호출 한뒤 사용

   strlen(구하고 싶은 길이의 변수명)

문자열을 복사하는 함수들: strcpy, strncpy

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

int main()

{ 
    char name[10];
    char copy_name[5];

    scanf("%s", &name);
    strcpy(capy_name, name); // strcpy 함수를 사용할 경우 앞에는 복사받는 변수명 뒤에는 복사할 변수명
    strncpy(capy_name, name, sizeof(copy_name)-1); 
    // strncpy 함수를 사용할 경우 복사받는 변수명, 복사할 변수명, 복사받는 변수명 길이-1 순으로 적는다
    copy_name[sizeof(copy_name)-1] = 0; // 뺀 자리에 0을 넣어 문자열의 끝이라는걸 알려준다.
    printf("%s", copy_name);
}
// 실행하면 strcpy는 copy_name의 길이와 상관없이 복사한 값을 모두 출력
// strncpy는 name있는 문자열을 복사 받은후 copy_name 길이에 하나 적게 출력됨
// 그 이유는 sizeof(copy_name)길이에 1를 뺀후 거기에 0를 붙였기 때문!
// 만약 끝에 0을 넣지 않고 strncpy(capy_name, name, sizeof(copy_name)); 를 출력하게 되면
//  copy_name의 끝을 알수 없어 원하는 값을 출력받지 못한다.

 문자열을 덧붙이는 함수들: strcat, strncat

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

int main()

{
    char name[10];
    char english_name[10];

    scanf("%s", &name);
    scanf("%s", &english_name);
    
	strcat(name, engilsh_name);
    // strcat함수를 사용할 경우 뒤에 붙일 변수명, 붙여질 변수명을 적으면 됨
    strncat(name, english_name, 3);
    // strncat함수를 사용할 경우 붙일 변수명, 붙여질 변수명, 어느정도 붙일 것인지의 길이 순으로 적으면 됨
    printf("%s", name);
}
// 문자열이 붙여 질때는 ~~~'\0'~~'\0'가 아닌 ~~~~~'\0' 처럼 붙여짐

 문자열을 비교하는 함수들: strcmp, strncmp

  두 문자열을 비교할때 쓰는 함수 앞의 문자열이 더 크면 양수 뒤에 문자열이 더 크면 음수 둘이 같으면 0을 반환한다.

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

int main()
{
	char color[10];
    char color2[10];

    scanf("%s", &color);
    scanf("%s", &color2);

    if (strcmp (color, color2) == 0) 
    // strcmp 함수를 사용할 경우 비교할 두 변수를 적으면됨
    if (strncmp (color, color2,3) == 0)
    // strncmp 함수를 사용할 비교할 두 변수와 비교할 길이를 적으면 됨
        printf("Equal");
    else
        printf("Not Equal");

}

 그 이외의 변환 함수들

#include <stdio.h>
#include <stdlib.h> // 사용하기전 호출

int main()
{
	int atoi // 문자열의 내용을 int 형으로 변환
	long atol // 문자열의 내용을 long 형으로 변환
	double atof  // 문자열의 내용을 double 형으로 변환
    
    // 사용방법은 atoi/l/f ( 바꿀 변수명)
}