본문 바로가기
자바 Java

문자열

by MEHAVING 2019. 10. 9.
반응형

문자열과 배열

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

int main(void)
{
    int aList[5] = {0}; //int 5개가 한 덩어리인 배열 선언 및 0으로 초기화
    int i=0; //배열의 사이즈

    for(int i=0; i<5; i++)
        scanf("%d", &aList[i]); //다섯번 반복해 사용자 입력을 받고 순차적으로 배열요소에 저장

    for(int i=0; i<5; i++)
        printf("%d\n", aList[i]);


    return 0;
}

 

-배열을 초기화 할 때 중괄호{0}로 묶어서

-모든 배열에 대해 입력받을 때는 & 주소 연산자가 필요

-배열의 첫번째 요소만 입력받을 때, 문자열을 하나를 배열의 첫번째 요소에 입력하고 싶을 때는 scanf에서 aList로만 해줘도 상관없음

-즉 &aList[0] = aList = 0번 요소의 주소 그러나 &aList[1] != aList

 

 

 

 

C언어의 문자열 String

 

- 문자배열을 만들어서 저장

문자열 char타입의 배열의 각 칸마다 문자 하나씩 저장됨

 

- '\0' ( null character ) 문자열의 끝을 표시하는 역할, 배열에 단어의 알파벳 하나씩 입력할 때는 마지막 index에 null 문자를 반드시 표기해야함. 끝을 표시하지 않으면 c언어는 문자열이 끝이 어딘지 알아차리지 못해 printf했을 시 문자열을 제대로 출력하지 못하는 등 문제가 발생할 수 있음

즉, 배열의 크기가 문자열의 길이보다 적어도 1만큼 길어야 한다

 

문자열 선언 방법

1) char szBuffer[6] = {'h','e','l','l','o','\0'};  //배열 각 요소의 값을 하나씩 기술하는 방식으로 초기화

2) char szData[8] = {"hello"};  //문자열 형태로 문자집합을 기술하는 방식으로 배열 초기화

3) char *pszBuffer = "hello";  //문자열 상수를 가리키는 포인터 변수 선언 및 초기화

 

문자열 배열을 선언하는 가장 보편적인 예는 2번, 그러나 내부적으로 뜯어보면 항상 1번처럼 되있음.

따라서, 보편적인 방법들은 NULL문자와 같은 초깃값들을 생략한 표현이다

 

 

배열의 이름은 문자열의 시작 주소를 가리킨다, 포인터

char str[] = "hello"; 은 char *str = "hello"; 로 assign가능,

but, 포인터를 사용해 정의된 문자열(String literal)은 수정이 불가능하다.

수정 말고 전혀 다른 새로운 문자열을 가리키게는 할 수 있다.

 

 

표준 라이브러리 string.h 

 

문자열을 다루는 다양한 함수를 제공하는 C언어

 

strcpy 문자열 복사

strlen 문자열의 길이

strcat 문자열 합치기

strcmp 문자열 비교

 

문자열을 입력받을 때

 

기본적으로 C언어에서는 scanf로 사용자에게 입력받을 때 & 연산자를 사용하여 주소값을 추출한다

하지만 문자열을 입력받을 때는 &연산자를 사용할 필요 없이 buffer라고 써주면 된다

그 이유는 문자열을 저장하는 배열 buffer는 배열의 첫번째 주소값을 가리키는 포인터 역할을 하기 때문에 &을 써주지 않아도 주소값이기 때문이다

 

 

입력받은 문자열, 문자열의 길이 출력

int main()
{
    //입력받을 포인터 변수 word 선언
    char buffer[40];
    while(1){
        printf("$ ");
        //scanf는 공백문자 기준으로 잘라 하나의 단어로 보기 때문에 단어 하나만 입력받게 됨
        scanf("%s", buffer);
        printf("%s: %d\n", buffer, strlen(buffer));
    }
    return 0;
}

 - scanf는 공백문자 기준으로 잘라 단어 하나씩 입력받는 함수

 

int main()
{
    //입력받을 포인터 변수 word 선언
    char buffer[40];
    while(1){
        printf("$ ");
        gets(buffer);
        printf("%s: %d\n", buffer, strlen(buffer));
    }
    return 0;
}

- gets는 줄바꿈(enter) 문자가 나올 때 까지 하나의 문자로 보고 입력 받는 함수/ 하지만 배열 index를 초과해서 입력 받는 등 여러 문제가 많음

-따라서 fgets 쓰는 것을 추천

 

#include <stdio.h>
#include <stdlib.h>
#define BUFFER_SIZE 100

int main()
{
    //입력받을 포인터 변수 word 선언
    char buffer[BUFFER_SIZE];
    while(1){
        printf("$ ");
        //매개변수 3개 1)fgets이 읽어올 배열 2)배열의 크기 3)키보드 표준 입력 파일
        fgets(buffer, BUFFER_SIZE, stdin);
        //new line character를 null 문자로
        buffer[strlen(buffer)-1] = '\0';
        printf("%s: %d\n", buffer, strlen(buffer));
    }
    return 0;
}

-fgets은 매개변수 3개 필수

  1)fgets이 읽어올 배열 2)배열의 크기 3)표준 입력, 즉 키보드 

 

-fgets은 두번째 매개변수로 2)입력해준 배열의 크기까지만 입력을 받음

 

 

 

#include <stdio.h>
#include <stdlib.h>
#define BUFFER_SIZE 100

int main()
{
    //입력받을 포인터 변수 word 선언
    char buffer[BUFFER_SIZE];
    int k;
    while(1){
        printf("$ ");
        k = read_line(buffer, BUFFER_SIZE);
        printf("%s: %d\n", buffer, k);
    }
    return 0;
}

int read_line( char str[], int n)
    {
        int ch, i =0;
        while((ch = getchar()) != '\n')
            if(i<n)
                str[i++] = ch;
        str[i] = '\0';
        return i;
    }

-ch는 int 자료형 (아스키 코드로 읽어와서 그런가?..)

-getchar()는 문자를 받아오는 함수

 

 

 

불필요한 공백을 제거한 입력받은 문자열 출력

 

반응형

댓글