10-11강

10강 문자

문자와 버퍼의 관계를이용하고 활용하는 방법

10-1 아스키 코드

  • C언어의 문자는 아스키 코드를 따른다. 1byte로 구성되며 주요 문자를 출력하도록 해준다. (한글은 유니코드)
  • character형에 숫자를 넣어서 처리할 수 있다.
    char a = 65;
문자아스키코드
0-948-57
A65
a97
#include <stdio.h>

int main(void){
	char a = 65;
    printf("%c\n",a);
    system("pause");
    return 0;
}
  • 문자 하나만 입력받을 땐 getchar()함수를 이용할 수 있다.
#include <stdio.h>

int main(void){
	char a = getchar();
    printf("%c\n",a);
    system("pause");
    return 0;
}

버퍼(buffer)
문자열을 버퍼의 개념이 많이 사용된다. 버퍼는 임시적으로 특정한 데이터를 저장하기 위한 목적으로 사용된다. 기본적으로 사용자가 의도하지 않아도 C 프로그램은 자동으로 버퍼를 이용해 입출력을 처리한다.

#define _CRT_SECURE_NO_WRANINGS
#include <stdio.h>

int main(){
	int a;
    char c;
    scanf("%d",&a);
    printf("%d\n",a);
    scanf("%c",c);
    printf("%c\n",c);
    system("pause");
    return 0;
}

100와 c를 입력했을 때 100밖에 출력되지 않는다. 그 이유는 엔터 자체를 c에 담기 때문이다. 즉 c에는 줄 바꿈을 담는다.

#define _CRT_SECURE_NO WARNINGS
#include <stdio.h>

int main(void){
	int a;
    char c;
	scanf("%d",&a);
    printf("%d\n",a);
    int temp;
    while((temp = getchar()) != EOF && temp != '\n'){}
    scanf("%c",&c);
    printf("%c\n",c);
    system('pause');
    return 0;
}   

while((temp = getchar()) != EOF && temp != '\n'){}
이 코드가 자동으로 개행문자나 파일의 끝이라면 빈코드를 실행함으로 버퍼로 개행문자가 저장되는 것을 막을 수 있다.

11강 문자열

11-1 개념

문자열:문자들의 배열
문자열은 컴퓨터 메모리 구조상에서 마지막에 널(NULL)값 포함.(문자열의 끝을 알리기 위해서)

printf()함수를 실행하면 null값을 발견할 때까지 쭉 출력을 한다.

11-2.문자열과 포인터

문자열 리터럴

어려운 말 같지만 결국 "" 안의 내용을 뜻하는 것이다.
문자열로 받기 위해 묶은 것을 뜻한다. 그러면 읽기 전용으로 상수가 된다.

#include <stdio.h>

int main(void){
char *a = "Hello world";
printf("%s\n",a);
system("pause");
return 0;
}

여기에서 *a에는 "hello world"라는 값이 담기게 된다.
char a = "Hello world!"

char *a = "hello world" 는 다르다.

문자열은 배열로 치환될 수 있고 배열은 포인터로 치환될 수 있으니까 포인터 자체를 출력하도록 하면 알아서 null 값을 만날때까지 출력하는 것이다.

포인터-문자열 관계

포인터로 문자열을 선언해도 기존의 배열처럼 처리가능하다

#include <stdio.h>

int main(void){
  char *a = "Hello world!";
  printf("%c\n", a[1]);
  printf("%c\n",a[4]);
  printf("%c\n",a[8]);
  system("pause");
return 0;
}

한 자리씩 출력하기때문에 %c를 쓴다.

11-3.문자열 입출력 함수

gets()

scanf()는 공백을 만날때까지 받지만 gets()함수는 공백 포함 한 줄 자체를 입력 받는다.

#define _CRT_SECIRE_NO_WARNINGS
#include <stdio.h>

int main(void){
	char a[100];
    gets(a);
    printf("%s\n",a);
    system("pause");
    return 0;
}


혹시나 두줄을 입력해보았지만 한 줄만 출력된다. 그러면 두줄을 입력받으려면 어떻게 해야하지?

gets_s()

gets()함수의 버퍼 크기 넘쳐도 받아버리는 취약점을 해결한 함수
버퍼의 크기를 철저히 지킨다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void){
  char a[100];
  gets_s(a,sizeof(a));
  printf("%s\n",a);
  system("pause");
return 0;
}

sizeof()전체 크기가 어느정도인지 알려주는 c언어의 내장함수
버퍼의 크기가 벗어나면 프로그램을 종료시킨다. 즉시 런타임 오류를 발생시킨다.

1-5. 문자열 처리 함수들

<string.h>라이브러리에 포함되어 있다.

strcpy(a,b)

a에 담긴 문자열이 b에 복사된다.
c언어에서는 'a=b'와 같이 간단한 복사가 되지 않기에 쓴다.

strstr()

긴 문자열에서 잛은 문자열을 찾아 그 위치를 반환시킨다.
'짧은 문자열을 찾은 주소 값' 자체를 반환한다.
그래서 단순히 출력하면 찾은 이후의 모든 문자열이 반환이 된다.

#include <stdio.h>
int main(void){
	char a[20] = "I like you";
    char b[20]= "like";
    printf("찾은 문자열:%s\n",strstr(a,b));
    system("pause");
    return 0;
}

좋은 웹페이지 즐겨찾기