C. 문자열
1. 문자열(string)
a. 문자열 상수(string constant)
큰따옴표("")를 사용해 표현되는 문자열을 문자열 상수(string constant)라고 함
이름이 없고, 내용을 변경할 수 없어서 상수라고 표현함
b. 문자열
🌟 메모리에 저장된 일련의 연속된 문자(character)들의 집합
👉 문자형 배열로 표현, 이 배열이 곧 문자열 변수가 됨
💥 문자형 배열이기 때문에 기본 타입에 포함되지 않음 = 연산자 사용 불가능
🤓 예제 : 문자열 상수 및 변수를 선언하는 여러 방법
char str01[] = "This is a string."; // 크기를 지정하지 않은 문자열 변수 선언
char str02[7] = "string"; // 크기를 지정한 문자열 변수 선언
printf("이것은 문자열 상수입니다.\n"); // 문자열 상수
printf("문자열 str01에 저장되어 있는 문자열은 \"%s\"입니다.\n", str01);
printf("문자열 str02에 저장되어 있는 문자열은 \"%s\"입니다.\n", str02);
✨ 실행결과
이것은 문자열 상수입니다.
문자열 str01에 저장되어 있는 문자열은 "This is a string."입니다.
문자열 str02에 저장되어 있는 문자열은 "string"입니다.
c. NULL 문자
문자형 배열로 선언된 문자열 변수는 문자열의 끝을 프로그램에 따로 알려줘야 함
그래야 실제 문자열에 속한 값과 그 외 쓰레기값을 구분할 수 있음
따라서 문자열에 속한 데이터가 끝나면, 문자열의 끝을 의미하는 문자(NULL)를 하나 더 삽입함
'\0'으로 표시, 아스키코드값은 0
🤓 예제 : 널 문자를 제외한 문자열의 길이를 계산하여 출력
int str_len = 0;
char str[] = "string";
while (str[str_len] != '\0') // 널 문자가 나올 때까지 길이를 증가함
{
str_len++;
}
printf("이 문자열의 길이는 %d입니다.\n", str_len);
✨ 실행결과
이것은 문자열 상수입니다.
문자열 str01에 저장되어 있는 문자열은 "This is a string."입니다.
문자열 str02에 저장되어 있는 문자열은 "string"입니다.
🎨 도식화

D. 문자열 입출력 함수
1. 문자열 입력 함수
a. fgets()
🌟 키보드뿐만 아니라 파일에서도 문자열을 입력받을 수 있는 함수
📘 원형
#include <stdio.h>
char *fgets(char * restrict s, int n, FILE * restrict stream);
첫 번째 인수 : 입력받는 문자열을 저장하기 위해 선언한 배열의 시작 주소
두 번째 인수 : 입력 받을 수 있는 문자열의 최대 길이
세 번째 인수 : 문자열을 입력받을 스트림
2. 문자열 출력 함수
a. puts()
🌟 표준 출력 스트림(stdout)인 모니터에 하나의 문자열을 출력하는 함수
모니터에 문자열을 출력한 다음 줄바꿈 ⭕
📘 원형
#include <stdio.h>
int puts(const char *s);
인수 : 출력할 문자열을 가리키는 포인터를 전달
b. fputs()
🌟 모니터뿐만 아니라 파일을 통해서도 문자를 출력(저장)할 수 있는 함수
문자 출력 후 줄바꿈 ❌
📘 원형
#include <stdio.h>
int fputs(const char * restrict s, FILE * restrict stream);
첫 번째 인수 : 출력할 문자열을 가리키는 포인터를 전달
두 번째 인수 : 문자열을 출력할 스트림을 전달
🤓 예제 : 입력한 문자열을 그대로 출력
#include <stdio.h>
int main(void)
{
char str[100];
fputs("문자열을 입력해 주세요 :\n", stdout);
fgets(str, sizeof(str), stdin);
puts("입력하신 문자열 : ");
puts(str); //자동줄바꿈
fputs("입력하신 문자열 : ", stdout);
fputs(str, stdout);
return 0;
}
✨ 실행결과
문자열을 입력해 주세요 :
C언어 문자열 입출력
입력하신 문자열 :
C언어 문자열 입출력
입력하신 문자열 : C언어 문자열 입출력
E. 문자열 처리 함수
1. 문자열 처리 함수
문자열은 문자형 배열 즉, 기본 타입이 아니기 때문에 함수를 이용해서 문자열 처리를 해야 함
a. strlen()
🌟 인수로 전달된 문자열의 길이를 반환하는 함수
👉 문자열 여부를 구분하는 마지막 문자인 널 문자는 문자열의 길이에서 제외
📘 원형
#include <string.h>
size_t strlen(const char *s);
🤓 예제 : 문자열의 길이를 구하기
char str[] = "C언어";
printf("이 문자열의 길이는 %d입니다.\n", strlen(str));
✨ 실행결과
이 문자열의 길이는 7입니다.
👉 utf-8 인코딩 환경에서 한글은 한 문자당 3바이트로 처리
b. strcat(), strncat()
🌟 하나의 문자열에 다른 문자열을 연결해주는 함수 (string concatenation)
💥 strcat()은 기준 문자열이 저장된 배열의 공간이 충분하지 않으면 남은 문자들이 흐르는 overflow가 발생
따라서 strncat()함수를 사용해야 함
👉 strncat()함수는 널 문자를 만나거나, 추가하는 문자의 개수가 세 번째 인수 길이에 도달할 때까지 추가
📘 원형
#include <string.h>
char *strncat(char * restrict s1, const char * restrict s2, size_t n);
첫 번째 인수 : 기준 문자열
두 번째 인수 : 추가하고자 하는 문자열의 복사본이 기준 문자열 뒤에 추가
세 번째 인수 : 추가할 문자열의 최대 길이를 지정
💙 restrict 키워드
포인터의 선언에서만 사용할 수 있는 C99부터 추가된 키워드
포인터를 선언할 때 이 키워드를 명시하면, 컴파일러는 해당 포인터가 가리키는 메모리에 대한 최적화를 실시
🎨 도식화

🤓 예제
char str01[20] = "C language is "; // 널 문자를 포함하여 15문자
char str02[] = "Cool! and funny!";
//strcat(str01, str02); // 이 부분의 주석 처리를 삭제한 후 실행시키면 배열 오버플로우가 발생함
strncat(str01, str02, 5); // 이렇게 최대 허용치를 설정해 놓으면 배열 오버플로우에 대해서는 안전해짐
puts(str01);
✨ 실행결과
C language is Cool!
c. strcpy(), strncpy()
🌟 첫 번째 인수로 전달된 배열에, 두 번째 인수로 전달된 문자열을 복사하는 함수
💥 strcpy()은 첫 번째 인수로 전달된 배열의 크기가 복사할 문자열의 길이보다 작으면, 배열 오버플로우가 발생
👉 strncpy()함수는 널 문자를 만나거나, 추가하는 문자의 개수가 세 번째 인수 길이에 도달할 때까지 추가
📘 원형
#include <string.h>
char *strncpy(char * restrict s1, const char * restrict s2, size_t n);
🎨 도식화

🤓 예제 1 : 문자열의 일부분만을 복사
char str01[20] = "C is Cool!";
char str02[11];
// str02 배열의 크기만큼만 복사를 진행하며, 마지막 한 문자는 널 문자를 위한 것임
strncpy(str02, str01, sizeof(str02)-1);
str02[sizeof(str02)-1] = '\0'; // 이 부분을 주석 처리하면, 맨 마지막에 널 문자를 삽입하지 않음
puts(str02);
✨ 실행결과
C is Cool!
👉 복사한 문자열의 마지막에는 반드시 널 문자를 삽입해 주어야만 C 프로그램이 제대로 문자열로 인식
🤓 예제 2 : 문자열의 일부분만을 수정
char str[20] = "C is cool!";
strncpy(str+5, "nice", 4); // 배열 이름을 이용한 포인터 연산으로 수정할 부분의 시작 부분을 지정함
puts(str);
✨ 실행결과
C is Cool!
👉 첫 번째 인수에 배열 이름을 이용한 포인터 연산을 사용하여 수정을 시작할 지점을 지정
d. strcmp(), strncmp()
🌟 두 개의 문자열 포인터를 전달받아 문자열의 내용을 비교하는 함수
⦁ 모든 문자는 아스키 코드값으로 자동 변환
⦁ 문자열의 맨 앞에서부터 순서대로 비교
⦁ 문자열을 비교하는 함수이므로, 문자를 비교할 때에는 관계연산자 '=='를 사용
📘 원형
#include <string.h>
int strcmp(const char *s1, const char *s2);
int strncmp(const char *s1, const char *s2, size_t n);
👉 둘이 하는일은 같고, 단지 세번째 인수를 가지고 있는지 없는지만 다르다
일치하지 않는 문자를 만나거나, 세 번째 인수로 전달된 문자의 개수만큼 비교를 계속함
📊 strcmp() 함수의 상황별 반환값
반환값 | 설명 |
양수 | 첫 번째 인수로 전달된 문자열이 더 큰 경우 |
0 | 두 문자열의 내용이 완전히 같은 경우 |
음수 | 두 번째 인수로 전달된 문자열이 더 큰 경우임. |
🤓 예제 : 문자열 내의 모든 영문자를 대문자로 변환
#include <stdio.h>
#include <string.h>
int main(void)
{
char str[20];
char ch;
while (1)
{
puts("미국의 수도를 입력하세요 :");
scanf("%s", str);
if (strcmp(str, "워싱턴") == 0 || strcmp(str, "washington") == 0) // 문자열의 비교
{
puts("정답입니다!");
break;
}
else
puts("아쉽네요~");
fflush(stdin);
puts("\n이 프로그램을 끝내고자 한다면 'q'를 눌러주세요!");
puts("계속 도전하고자 하시면 Enter를 눌러주세요!");
scanf("%c", &ch);
if (ch == 'q') // 문자의 비교
{
break;
}
fflush(stdin);
}
return 0;
}
✨ 실행결과
미국의 수도를 입력하세요 :
뉴욕
아쉽네요~
이 프로그램을 끝내고자 한다면 'q'를 눌러주세요!
계속 도전하고자 하시면 Enter를 눌러주세요!
미국의 수도를 입력하세요 :
워싱턴
정답입니다!
e. atoi(), atol(), atoll(), atof()
🌟 인수로 전달된 문자열을 해당 타입의 숫자로 변환시켜주는 함수
📘 원형
#include <stdlib.h>
int atoi(const char *nptr); // int형 정수로 변환함.
long int atol(const char *nptr); // long형 정수로 변환함.
long long int atoll(const char *nptr); // long long형 정수로 변환함.
double atof(const char *nptr); // double형 실수로 변환함.
🤓 예제 : 숫자로 이루어진 문자열을 숫자로 변환하여, 곱셈 연산을 수행
char str01[] = "10";
char str02[] = "20";
printf("문자열을 숫자로 변환해서 곱한 값은 %d입니다.\n", atoi(str01) * atoi(str02));
✨ 실행결과
문자열을 숫자로 변환해서 곱한 값은 200입니다.
f. toupper(), tolower()
🌟 인수로 전달된 문자열의 영문자를 모두 대문자나 소문자로 변환시켜주는 함수
📘 원형
#include <ctype.h>
int toupper(int c); // 문자열의 모든 영문자를 대문자로 변환함.
int tolower(int c); // 문자열의 모든 영문자를 소문자로 변환함.
🤓 예제 : 문자열 내의 모든 영문자를 대문자로 변환
int i, str_len;
char str[] = "Hello C World!";
printf("원래 문자열 : %s\n", str);
str_len = strlen(str);
for (i = 0; i < str_len; i++)
{
str[i] = toupper(str[i]);
}
printf("바뀐 문자열 : %s\n", str);
✨ 실행결과
원래 문자열 : Hello C World!
바뀐 문자열 : HELLO C WORLD!
출처 : http://www.tcpschool.com/c/c_string_string
코딩교육 티씨피스쿨
4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등
tcpschool.com
'프로그래밍 언어 > C' 카테고리의 다른 글
[입력과 출력] 파일 입출력 : fopen() 모드 문자열 (0) | 2023.08.17 |
---|---|
[입력과 출력] 콘솔 입출력, 파일 입출력, 파일 입출력 함수 (0) | 2023.08.17 |
[문자와 문자열] 입출력 함수 총정리 1 : 스트림과 문자 (0) | 2023.08.17 |
[메모리의 관리] 메모리의 기초 총정리 (0) | 2023.08.17 |
[자료형(data type)] C 파생형 공용체와 열거체 (0) | 2023.08.17 |