[C 언어] - String

RuiN·2022년 8월 5일
0

C

목록 보기
6/6
post-thumbnail

String

문자열은 char타입의 배열의 각 칸마다 문자 하나씩 저장이 됩니다.

    char str[6];
   str[0] = "h";
   str[1] = "e";
   str[2] = "l";
   str[3] = "l";
   str[4] = "o";
   str[5] = "\0"; // 문자열 끝을 표시하는 역할 & 배열의 크기는 문자 길이보다 1커야함

이렇게 일일이 저장하는 일은 매우 귀찮은 일입니다.
그래서 C 언어에서는 문자열을 생성하는 편리한 방법을 제공합니다.

char str[] = "hello";
or
char *str = "hello";

하지만 포인터 변수로 선언한 String 은 수정이 불가능합니다.
이것을 String Literal 이라고 부릅니다.


string.h 라이브러리 Method

  • string.h 라이브러리는 문자열을 다루는 다양한 함수를 제공합니다.
    • strcpy = 문자열 복사
    • strlen = 문자열의 길이
    • strcat = 문자열 합치기
    • strcmp = 문자열 비교

문자열 저장

  • 여러개의 단어들을 포인터를 이용하여 저장을 해봅시다!
#include <stdio.h>

#define BUFFER_SIZE 100

int main(void) {

    char *words[100];
    int n = 0;
    char buffer[BUFFER_SIZE];

    while (n < 4 && scanf("%s", buffer) != EOF) {
        words[n] = buffer;
        n++;
    }

    for (int i = 0; i < 4; ++i) {
        printf("%s\n", words[i]);
    }
    
    return 0;
};

words 의 포인터 배열을 선언하고
while 문을 통해서 buffer에 입력한 값을 words에 넣어줍니다.
그다음 for문을 통해서 words의 값들을 순서대로 출력합니다

first
second
third
fourth
//입력값

fourth
fourth
fourth
fourth
//출력값

위와 같은 출력이 됩니다.
이렇게 된 이유는 words에 계속 같은주소에 덮어쓰기가 되었다고 생각하시면 됩니다.

then

그렇다면 입력된값을 words에 복사를 진행한다면?

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

#define BUFFER_SIZE 100

int main(void) {

    char *words[100];
    int n = 0;
    char buffer[BUFFER_SIZE];

    while (n < 4 && scanf("%s", buffer) != EOF) {
        words[n] = strcpy(words[n], buffer);
        n++;
    }

    for (int i = 0; i < 4; ++i) {
        printf("%s\n", words[i]);
    }

    return 0;
};

출력값을 볼 필요도 없이 exit code에서 에러가 발생합니다.

sucess

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

#define BUFFER_SIZE 100

int main(void) {

   char *words[100];
   int n = 0;
   char buffer[BUFFER_SIZE];

   while (n < 4 && scanf("%s", buffer) != EOF) {
       words[n] = strdup(buffer);
       n++;
   }

   for (int i = 0; i < 4; ++i) {
       printf("%s\n", words[i]);
   }

   return 0;
};

strcpy 함수가 아닌
strdup 함수를 사용하여 words 포인터 배열에 값을 복사하여 넣는다면!

first
second
third
fourth
//입력값

first
second
third
fourth
//출력값

다음과 같이 정상적으로 값이 입력된 순서대로 출력되는것을 확인하고,
words 포인터 배열에 올바르게 값이 넣어진것 또한 확인 할 수 있습니다.

profile
어디까지 올라갈지 궁금한 하루

0개의 댓글