12. 문자열

2025. 11. 29. 13:49·Coding/C
  • 문자열 상수 (literal) : "abc"

- " " 로 묶인 문자들의 나열

- 끝에 NULL 문자('\0') 포함

 

- 저장 위치 : Data 영역 (수정 불가능)

 

  • 문자열 변수 (variable) : char str[] = "abc";

- C언어 에서는 별도의 문자열 타입 존재 X (Python: str 존재) >> 문자 배열 (char str[])을 사용해 문자열 상수의 값을 복사하여 사용

- 문자열 상수는 항상 끝에 NULL 문자를 포함하므로, 배열의 크기를 (문자열 길이 + 1) 로 선언하여야 문자열 함수 사용시 오류 X

 

- 저장 위치 : Stack 영역 (수정 가능)

 

  • 문자열 포인터 : char *p = "abc";

- 문자열 상수를 가리키는 포인터

- 포인터 변수(p)는 주소(문자열 상수 "abc"의 첫 번째 글자인 'a'의 주소)를 저장

 

- 저장 위치 : 포인터 변수(p) - Stack 영역 // 가리키는 대상 = 문자열 상수 - Data 영역

>> 내용 수정 불가 : *p = 'd'; 불가능 (*p == str[0] == 'a') (Data 영역의 수정 시도)

>> 주소 변경 가능 :  p = "def"; 가능 (주소 변경 전: *p = 'a', 주소 변경 후 *p = 'd') (Stack 영역의 수정 시도)

 

  • 문자열 입출력 함수 <stdio.h>
  함수 공백(' ') / 개행('\n') 처리 NULL('\0')
처리
오버플로우
가능성
반환값
입력 scanf("%s", [포인터]) 공백이나 개행 전까지 읽음
개행 문자 제거
O O 읽은 항목(형식 지정자)의 개수
(int)
gets([포인터]) 개행 전까지 읽음
개행 문자 제거
O O 성공 : [포인터]
실패/EOF : NULL
fgets([포인터], [크기], stdin) 개행 전까지 읽음
개행 문자 포함
O X 성공 : [포인터]
실패/EOF : NULL
출력 printf("%s", [포인터/문자열상수]) 끝에 개행 추가 X - - 출력된 문자의 개수
(int)
puts([포인터/문자열상수]) 끝에 개행 추가 O - - 성공 : (int)>0
실패 : EOF(-1)
fputs([포인터/문자열상수], stdout) 끝에 개행 추가 X - - 성공 : (int)>0
실패: EOF(-1)

 

  • 문자열 처리 함수 <string.h>
함수 설명 오버플로우
가능성
반환값
strlen(s) 문자열의 길이 계산 (NULL 제외) - 문자열의 길이
(size_t)
strcmp(s1,s2) 문자열 s1과 s2를 사전순(ASCII 코드) 비교 - ASCII 코드 차이값
(int)(s1-s2)
strcmp(s1,s2, n) 문자열 s1과 s2를 n개까지 사전순(ASCII 코드) 비교 - ASCII 코드 차이값
(int)(s1-s2)
strcpy(dest,src)
**dest는 문자열 상수 불가
문자열 src를 dest로 복사 O dest의 시작 주소
(char *)
strncpy(dest,src,n)
**dest는 문자열 상수 불가
문자열 src를 dest로 n개 복사 X dest의 시작 주소
(char *)
strcat(dest,src)
**dest는 문자열 상수 불가
문자열 src를 dest의 NULL 위치부터 이어붙이기 O dest의 시작 주소
(char *)
strncat(dest,src,n)
**dest는 문자열 상수 불가
문자열 src를 dest의 NULL 위치부터 n개 이어붙이기
(끝에 NULL 추가)
- dest의 시작 주소
(char *)

 

 

 

  • 예제

- 문자열 뒤집기

#include <stdio.h>

void reverse(char *message) {
    char *head = message;
    char *tail = message;

    while (*tail != '\0' || *tail != '\n') {
        tail++;
    } tail--; // 실제 문자가 존재하는 지점으로 이동
    
    while (head < tail) { 
        // 뒤집는 동작
        char tmp = *head; 
        *head = *tail;
        *tail = tmp;

        // 포인터 이동
        head++;
        tail--;
    }
}

int main() {
    char message[100];
    printf("Enter a string: ");
    gets(message);
    
    reverse(message);
    printf("Reversed string: %s\n", message);

    return 0;
}

 

- 숫자들의 합 구하기

#include <stdio.h>

int main() {
    char num[101] = {"\0"};
    gets(num); // gets는 줄바꿈 문자 소비

    int sum = 0;
    int tmp = 0;
    char *p = num;
    while (*p != '\0') {
        if (*p != ' ') {
            tmp = tmp * 10 + (*p - '0'); // 자릿수 올림
        } else {
            sum += tmp;
            tmp = 0;
        } p++;
    } sum += tmp;
    return 0;

    printf("Sum = %d\n", sum);
    return 0;
}

'Coding > C' 카테고리의 다른 글

13. 구조체(struct), 열거형(enum), 동적 메모리 할당(malloc), 연결 리스트  (0) 2025.12.15
11. 포인터와 배열  (0) 2025.11.21
10. 포인터  (0) 2025.11.21
09. 변수의 범위와 지속기간  (0) 2025.11.21
08. 함수  (0) 2025.10.17
'Coding/C' 카테고리의 다른 글
  • 13. 구조체(struct), 열거형(enum), 동적 메모리 할당(malloc), 연결 리스트
  • 11. 포인터와 배열
  • 10. 포인터
  • 09. 변수의 범위와 지속기간
rlarudfhr
rlarudfhr
  • rlarudfhr
    androcom
    rlarudfhr
  • 전체
    오늘
    어제
    • 분류 전체보기 (96)
      • Coding (28)
        • Python (10)
        • C (13)
        • Github & Git (2)
        • WEB FE (3)
      • Mathematics (3)
        • 미적분학 (19)
        • 통계학 (16)
        • 선형대수 (10)
      • Quantum Computing (0)
      • PC & Mobile & Audio (7)
      • Etc (13)
  • 링크

    • Github
    • Baekjoon
    • Instagram
  • 공지사항

  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
rlarudfhr
12. 문자열
상단으로

티스토리툴바