/* 문자열 — char 배열 끝에 \0 을 붙인 것
   컴파일:  gcc c-string.c -o str -Wall                  */

#include <stdio.h>
#include <string.h>        /* strcmp, strcpy, strlen 을 쓰려면 필요 */

int main(void)
{
    /* 끝에 \0 이 자동으로 붙습니다. 그래서 크기는 글자 수 + 1 입니다. */
    char 이름[20] = "김서연";
    char 인사말[] = "abc";

    printf("이름: %s\n", 이름);
    printf("strlen(\"abc\") = %zu\n", strlen(인사말));   /* 3  — \0 은 안 셉니다 */
    printf("sizeof(\"abc\") = %zu\n", sizeof(인사말));   /* 4  — \0 까지 셉니다 */

    /* 배열이므로 한 칸씩 꺼낼 수 있습니다. 다만 char 는 "글자" 가 아니라
       "1바이트" 입니다. 영문·숫자는 한 글자가 1바이트라 그대로 나옵니다. */
    char 영문[] = "Hello";
    for (size_t i = 0; i < strlen(영문); i++) {
        printf("[%c]", 영문[i]);          /* [H][e][l][l][o] */
    }
    printf("\n");

    /* 한글은 한 글자가 UTF-8 로 3바이트입니다. 그래서 이렇게 하면 깨집니다.
       strlen("김서연") 이 3 이 아니라 9 로 나오는 것도 같은 이유입니다.     */
    printf("strlen(이름) = %zu  (글자 수가 아니라 바이트 수)\n", strlen(이름));

    /* ── 비교: == 는 주소를 봅니다. 내용은 strcmp ── */
    char 입력[20] = "김서연";

    if (strcmp(이름, 입력) == 0) {          /* 같으면 0 */
        printf("같은 이름입니다.\n");
    } else {
        printf("다른 이름입니다.\n");
    }

    printf("사전순 비교: %d\n", strcmp("apple", "banana"));   /* 음수 */

    /* ── 복사: = 로는 안 됩니다 ── */
    char 사본[20];
    /* 사본 = 이름;   ← 컴파일 오류 */
    strcpy(사본, 이름);
    printf("사본: %s\n", 사본);

    /* strcpy 는 대상 배열이 작으면 그냥 넘쳐서 남의 메모리를 덮어씁니다.
       snprintf 는 sizeof 로 한계를 알려 주므로, 자리가 모자라면 넘치는 대신
       들어갈 만큼만 담고 끝에 \0 을 붙입니다. 이쪽이 안전합니다.          */
    char 칸[60];
    snprintf(칸, sizeof(칸), "%s님 환영합니다", 이름);
    printf("안전하게 담기: %s\n", 칸);

    /* 이어 붙이기 */
    char 문장[40] = "안녕하세요, ";
    strcat(문장, 이름);
    strcat(문장, "님");
    printf("%s\n", 문장);

    /* ── 한 줄 입력은 fgets. scanf("%s") 는 공백에서 끊깁니다 ── */
    char 한줄[50];
    printf("한 줄 입력: ");
    if (fgets(한줄, sizeof(한줄), stdin) != NULL) {
        한줄[strcspn(한줄, "\n")] = '\0';    /* 줄 끝 엔터 떼어내기 */
        printf("받은 줄: [%s] (%zu글자)\n", 한줄, strlen(한줄));
    }

    /* char 배열은 고칠 수 있지만, char * 가 가리키는 문자열은 못 고칩니다 */
    char 고칠수있음[] = "abc";
    고칠수있음[0] = 'A';
    printf("고친 결과: %s\n", 고칠수있음);

    const char *못고침 = "abc";       /* const 를 붙여 실수를 막습니다 */
    printf("읽기만: %s\n", 못고침);

    return 0;
}
