본문 바로가기
Programming/컴퓨터프로그래밍및실습

[컴프실] 제12장: 문자와 문자열

by Lizardee 2023. 8. 27.
문자열 표현 방법
  • 문자열(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()

getchar(), _getch(), _getche()

 

_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() 반환값

// 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"
};