- 문자열 상수 (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 |