문자열 표현 방법
- 문자열(string): 문자들이 여러 개 모인 것
- 문자열 변수: 변경 가능한 문자열을 저장할 수 있는 변수
NULL 문자
: 문자열의 끝을 나타낸다.
#include <stdio.h>
int main(void) {
int i;
char str[4];
str[0] = 'a';
str[1] = 'b';
str[2] = 'c';
str[3] = '\0'; //NULL 문자
i = 0;
while (str[i] != '\0') {
printf("%c", str[i]);
i++;
}
return 0;
}
문자 배열의 초기화
char str[4] = {'a', 'b', 'c', '\0'};
문자열의 출력
char str[] = "abc";
printf("%s", str);
#include <stdio.h>
int main(void) {
char str1[6] = "Seoul";
char str2[3] = { 'i', 's', '\0' };
char str3[] = "the capital city of Korea.";
printf("%s %s %s\n", str1, str2, str3);
return 0;
}
#include <stdio.h>
int main(void) {
char src[] = "Action speaks louder than words";
char dst[100];
int i;
printf("원본 문자열 = %s\n", src);
for (i = 0; src[i] != '\0'; i++)
dst[i] = src[i]; //dst[i]에 src[i] 복사하기
dst[i] = '\0'; //dst[i]에 '\0' 넣기
printf("복사된 문자열 = %s\n", dst);
return 0;
}
//문자열의 길이를 구하는 프로그램
#include <stdio.h>
int main(void) {
char str[30] = "C language is easy";
int i = 0;
while (str[i] != '\0')
i++;
printf("문자열 \"%s\"의 길이는 %d입니다.\n", str, i);
return 0;
}
문자 배열을 변경하는 방법
▶ 배열 요소에 원하는 문자를 개별적으로 대입하는 방법
char str[10] = "Hello";
▶ strcpy() 함수: 문자열을 문자 배열에 복사한다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main(void) {
char str[100] = "Hello";
strcpy(str, "Hello World!");
printf("%s", str);
return 0;
}
문자열 상수
- 문자열 상수: "HelloWorld"와 같이 프로그램 소스 안에 포함된 문자열
--> 문자열 상수는 메모리 영역 중, 텍스트 세그먼트(text segment)에 저장한다.
char *p = "HelloWorld";
- 데이터 세그먼트: 값을 변경할 수 있는 메모리 영역
- 텍스트 세그먼트: 값을 읽기만 하고 변경할 수는 없는 메모리 영역
#include <stdio.h>
int main(void) {
const char* p = "HelloWorld"; //const char *p
printf("%s\n", p);
p = "Welcome to C World";
printf("%s\n", p);
p = "Goodbye";
printf("%s\n", p);
return 0;
}
문자 입출력 라이브러리
int getchar(void) // 하나의 문자를 읽어서 반환한다.
void putchar(int c) // 변수 c에 저장된 문자를 출력한다.
int _getch(void) // 하나의 문자를 읽어서 반환한다. (버퍼를 사용하지 않음)
void _putch(int c) // 변수 c에 저장된 문자를 출력한다. (버퍼를 사용하지 않음)
scanf("%c", &c) // 하나의 문자를 읽어서 변수 c에 저장한다.
printf("%c", c); // 변수 c에 저장된 문자를 출력한다.
getchar(), putchar()
#include <stdio.h>
int main(void) {
int ch; //int ch; 정수형 변수
while ((ch = getchar())!=EOF) //getchar()
putchar(ch); //putchar()
return 0;
}
EOF(End Of File)
: 입력의 끝을 나타내는 특수한 기호
_getch(), getche(), getchar()
_getch(), _putch()
#include <stdio.h>
#include <conio.h>
int main(void) {
int ch;
while ((ch = _getch()) != 'q')
_putch(ch);
return 0;
}
문자열 입출력 라이브러리 함수
int scanf("%s", &s) // 문자열을 읽어서 문자배열 s[]에 저장한다.
int printf("%s", s) // 배열 s[]에 저장되어 있는 문자열을 출력한다.
char *gets_s(char*s, int size) // 한 줄의 문자열을 읽어서 문자배열 s[]에 저장한다.
int puts(const char*s) // 배열 s[]에 저장되어 있는 한 줄의 문자열을 출력한다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void) {
char name[100];
char address[100];
printf("이름을 입력하시오: ");
scanf("%s", &name);
printf("현재 거주하는 주소를 입력하시오: ");
scanf("%s", address);
printf("안녕하세요, %s에 사는 %s씨.\n", address, name);
return 0;
}
gets_s()와 puts() 문자열 입출력
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void) {
char name[100];
char address[100];
printf("이름을 입력하시오: ");
gets_s(name, sizeof(name)); //sizeof(name): 한 단어 이상을 입력받을 때 사용
printf("현재 거주하는 주소를 입력하시오: ");
gets_s(address, sizeof(address)); //sizeof(address)
printf("안녕하세요, %s에 사는 %s씨.\n", address, name);
}
문자 처리 라이브러리 함수
#include <stdio.h>
#include <ctype.h>
int main(void) {
int c;
while ((c = getchar()) != EOF) {
if (islower(c)) // 소문자인지 검사
c = toupper(c); // 대문자로 변환
putchar(c);
}
return 0;
}
Lab: 단어 세기
// 단어 세기
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <ctype.h>
int count(const char* s) {
int i, wc = 0, waiting = 1;
for (i = 0; s[i] != NULL; i++) {
if (isalpha(s[i])) { // s의 글자가 알파벳이면
if (waiting) { // 단어를 기다리고 있으면
wc++;
waiting = 0;
}
}
else // 알파벳이 아니면
waiting = 1; // 단어를 기다린다.
}
return wc;
}
int main(void) {
int wc = count("the c book...");
printf("단어의 개수: %d\n", wc);
return 0;
}
Lab: 유효한 암호 확인
//유효한 암호는 7글자 이상이고, 하나 이상의 소문자, 하나 이상의 대문자, 하나 이상의 숫자 포함
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h> //exit(1)
int main(void) {
int lower_case_count = 0; //소문자 개수
int upper_case_count = 0; //대문자 개수
int digit_count = 0; //숫자 개수
char pass[100];
int len;
printf("패스워드를 입력하시오: ");
gets_s(pass, sizeof(pass)); //gets_s(pass, sizeof(pass));
len = strlen(pass); //문자열의 길이
if (len < 7) {
printf("유효한 암호가 아닙니다.\n");
exit(1);
}
for (int i = 0; i < len; i++) {
if (islower(pass[i])) //islower
lower_case_count++;
if (isupper(pass[i])) //isupper
upper_case_count++;
if (isdigit(pass[i])) //isdigit
digit_count++;
}
if (lower_case_count > 0 && upper_case_count > 0 && digit_count > 0)
printf("강한 암호입니다.\n");
else
printf("유효한 암호가 아닙니다.\n");
return 0;
}
문자열 처리 라이브러리
문자열의 길이
- strlen()
#include <stdio.h>
#include <string.h>
int main(void) {
int size = strlen("Hello");
printf("%d", size);
return 0;
}
문자열 복사
- strcpy()
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main(void) {
char dst[6];
char src[6] = "Hello";
strcpy(dst, src); //src를 dst로 복사한다.
printf("%s", dst);
return 0;
}
문자열 연결
- strcat()
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main(void) {
char dst[12] = "Hello";
char src[6] = "World";
strcat(dst, src); // dst == HelloWorld
printf("%s", dst);
return 0;
}
// strcpy(): 문자열 복사, strcat(): 문자열 연결
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main(void) {
char string[80];
strcpy(string, "Hello world from ");
strcat(string, "strcpy ");
strcat(string, "and ");
strcat(string, "strcat!");
printf("string = %s\n", string);
return 0;
}
문자열 비교
- strcmp()
/* strcmp () */
int result = strcmp("dog", "dog"); // 0이 반환된다.
// strcmp() 함수
#include <stdio.h>
#include <string.h>
int main(void) {
char s1[80];
char s2[80];
int result;
printf("첫 번째 단어를 입력하시오: ");
scanf("%s", s1);
printf("두 번째 단어를 입력하시오: ");
scanf("%s", s2);
result = strcmp(s1, s2); // strcmp(s1, s2);
if (result < 0)
printf("%s가 %s보다 앞에 있습니다.\n", s1, s2);
else if (result == 0)
printf("%s와 %s가 같습니다.\n", s1, s2);
else
printf("%s가 %s보다 뒤에 있습니다.\n", s1, s2);
return 0;
}
문자 검색
- strchr()
/* strchr () */
char* p = strchr("dog", 'g');
#include <string.h>
#include <stdio.h>
int main(void) {
char s[] = "language";
char c = 'g';
char* p;
int loc;
p = strchr(s, c); // strchr() 함수
if (p == NULL)
printf("%c가 발견되지 않았음\n", c);
else {
loc = (int)(p - s);
printf("%s에서 첫 번째 %c가 %d에서 발견되었음\n", s, c, loc);
}
return 0;
}
문자열 검색
- strstr()
/* strstr() */
char* p = strstr("dog and cat", "cat");
#include <string.h>
#include <stdio.h>
int main(void) {
char s[] = "A bird in hand is worth two in the bush.";
char sub[] = "bird";
char* p;
int loc;
p = strstr(s, sub);
if (p == NULL)
printf("%s가 발견되지 않았음\n", sub);
else {
loc = (int)(p - s); //p: 포인터, s: 원본 문자열의 시작 부분 포인터
printf("%s에서 첫 번째 %s가 %d에서 발견되었음\n", s, loc);
}
return 0;
}
문자열 토큰 분리
- strtok()
/* strtok */
char* p = strtok("Hello World", " "); //분리자
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main(void) {
char s[] = "Man is immortal, because he has a soul";
char* token;
token = strtok(s, " "); //(s, " ");
while (token != NULL) {
printf("토큰: %s\n", token);
token = strtok(NULL, " "); //(NULL, " ");
}
return 0;
}
Lab: 단답형 퀴즈 프로그램
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main(void) {
char key[] = "C";
char buffer[80];
do {
printf("임베디드 장치에 가장 많이 사용되는 언어는? ");
gets_s(buffer, sizeof(buffer));
} while (strcmp(key, buffer) != 0); //key값과 같아짐
printf("맞았습니다!");
return 0;
}
문자열 수치 변환
- 문자열 "36.5"와 수치값 36.5는 컴퓨터 안에서 상당히 다르게 저장된다.
sprintf(), sscanf()
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void) {
char instring[] = "file 12";
char name[10];
int number;
sscanf(instring, "%s%d", name, &number); //sscanf()
printf("name = %s\n", name);
printf("number = %d\n", number);
return 0;
}
// sscanf()
sscanf(instring, "%s%d", name, &number);
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void) {
char buffer[50];
int x = 10, y = 20, result;
result = x + y;
sprintf(buffer, "정수 %d와 정수 %d를 더하면 %d입니다.\n", x, y, result);
printf("%s\n", buffer);
return 0;
}
// sprintf()
sprintf(buffer, "정수 %d와 정수 %d를 더하면 %d입니다.", x, y, result);
printf("%s\n", buffer);
Lab: 영상 파일 이름 자동 생성
#include <stdio.h>
#include <string.h>
int main(void) {
char filename[100];
for (int i = 0; i < 6; i++) {
sprintf(filename, "image%d.jpg", i); //sprintf
printf("%s\n", filename); //printf
}
return 0;
}
문자열을 수치로 변환하는 전용함수
- 전용 함수는 scanf()보다 크기가 작다.
- stdlib.h에 원형 정의
int atoi(const char* str); //str을 int형으로 변환한다.
double atof(const char* str); //str을 double형으로 변환한다.
// 문자열 수치 변환
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char s1[] = "100";
char s2[] = "12.93";
int i;
double d, result;
i = atoi(s1); //int형으로 변환
d = atof(s2); //double형으로 변환
result = i + d;
printf("연산 결과는 %.2f입니다.\n", result);
return 0;
}
문자열의 배열
- 문자열 배열
- 문자 포인터 배열
(1) 문자열 배열
char s[3][6] = {
"init",
"open",
"close";
};
// 문자열 배열
#include <stdio.h>
int main(void) {
char menu[5][10] = {
"init",
"open",
"close",
"read",
"write"
};
for (int i = 0; i < 5; i++)
printf("%d번째 메뉴: %s\n", i + 1, menu[i]);
return 0;
}
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void) {
char fruits[3][20]; // 2차원 배열
for (int i = 0; i < 3; i++) {
printf("과일 이름을 입력하시오: ");
scanf("%s", fruits[i]);
}
for (int i = 0; i < 3; i++)
printf("%d번째 과일: %s\n", i + 1, fruits[i]);
return 0;
}
(2) 문자 포인터 배열
char* s[3] = {
"init",
"open",
"close"
};
'Programming > 컴퓨터프로그래밍및실습' 카테고리의 다른 글
[컴프실] 제13장: 구조체 (0) | 2023.08.29 |
---|---|
[컴프실] 제11장: 포인터 (0) | 2023.08.11 |
[컴프실] 제10장-2: 정렬 (0) | 2023.07.23 |
[컴프실] 9~12일차 실습문제 (0) | 2023.07.20 |
[컴프실] 제10장: 배열 (0) | 2023.07.19 |