본문 바로가기
Programming/C

12. 문자열

by 기딩 2023. 10. 19.
728x90

NULL문자 : 문자열의 끝을 나타냄

문자열이 어디서 종료되는지 알도록

#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;
}

B : 16진수 11

‘B’ :문자, 0x42

“B” :문자열 0x42 \0

 

버퍼 : 중간 단계의 메모리

ex) 키보드 누르면 키보드 안에 버퍼가 있어서 저장

입출력 함수 설명
int getchar(void) 하나의 문자를 읽어서 반환
void putchar(int c) 변수 c에 저장된 문자 출력
int _getch(void) 하나의 문자 읽어서 반환(버퍼x)
void _putch(int c) 변수 c에 저장된 문자 출력(버퍼x)
scanr(”%c”, &c) 하나의 문자 읽어서 변수 c에 저장
prinf(”%c”, c); 변수 c에 저장된 문자 출력

 

getchar(), putchat()

#include <stdio.h>
int main(void)
{
	int ch;
	while ((ch = getchar()) != EOF) //end of file나타냄. 정수형
		putchar(ch); //버퍼 있어서 출력
	return 0;
}

 

버퍼링 : 엔터키를 쳐야만 입력 받는 이유

 

_getch(), _putch()

#include <stdio.h>
#include <conio.h>

int main(void)
{
	int ch;
	while ((ch = _getch()) != 'q') //버퍼사용x, 에코도 없음
		_putch(ch);
	return 0;
}

 

  헤더파일 버퍼사용 에코 응답성 문자 수정
getchar() <stdio.h> 사용(엔터 눌러입력) 에코 줄단위 가능
_getch() <conio.h> 사용x 에코x 문자단위 불가능
_getche() <conio.h> 사용x 에코 문자단위 불가능

→ 용도 맞게, 버퍼 없이 바로 받으려면 getch()

 

 

gets_s(), put() 문자열 입출력

char buf[100];

gets_s(buf, 100); //사용자로부터 한 줄 입력받음. 최대 입력 개수 100개

puts(buf);

#include <stdio.h>
int main(void)
{
	char name[100];
	char address[100];
	printf("이름을 입력하시오: ");
	gets_s(name, 100);
	printf("현재 거주하는 주소를 입력하시오: ");
	gets_s(address, 100);
	puts(name);
	puts(address);

	return 0;
}

 

문자 처리 라이브러리 함수

함수 설명  
isalpha(c) c가 영어문자? a-z, A-Z
isupper(c) 대문자 A-Z
islower(c) 소문자 a-z
isdigit(c) 숫자(0-9) 0-9
isalnum(c) 영문자,숫자 a-z, A-Z, 0-9
iscdigit(c) 16진수 숫자 0-9, A-F, a-f
isspace(c) 공백문자 ‘’, ‘\n’, ‘\t’, ‘\v’, ‘\r’
ispunct(c) 구두점 문자  
isprint(c) 출력가능문자  
iscntrl(c) 제어문자  
isascii(c) 아스키코드  
toupper(c) 대문자로 바꿈  
tolower(c) 소문자로 바꿈  
toascii(c) 아스키코드로 바꿈  

 

단어 세기 예제 ex) the c book → 3개

//이런 스킬 자주 씀

#include <stdio.h>
#include <ctype.h>

int count_word(char* s);
int main(void)
{
	int wc = count_word("the c book...");
	printf("단어의 개수: %d \\n", wc);

	return 0;
}

//음절 수 세기
int count_word(char* s)
{
	int i, wc = 0, waiting = 1;

	//알파벳에서 공백 0->1, 공백에서 알파벳1->0
	// So, 알파벳 동안은 계속 0
	for (i = 0; s[i] != NULL; ++i) { 
		if (isalpha(s[i])) {
			if (waiting) { 
				wc++;
				waiting = 0;
			}
		}
		else waiting = 1;
	}
	return wc;
}

 

문자열 처리 라이브러리

함수의 원형(매개변수 : 포인터) strlen(s) : 문자열 s의 길이

strcpy(s1, s2) : s2를 s1에 복사

strcat(s1, s2): s1 끝에 s2 붙임

strcmp(s1, s2) : 비교

strncpy(s1, s2, n): s2의 최대 n개 문자를 s1에 복사

strncmp(s1, s2, n): s2의 최대 n개 문자를 s1에 붙여넣기

strncmp(s1, s2, n): 최대 n개 문자를 비교

strchr(s, c) : 문자열 s에서 문자 c 찾기

strstr(s1, s2) : 문자열 s1에서 문자열 s2찾기

#define _CRT_SECURE_NO_WARNINGS
#include <string.h>
#include <stdio.h>

int main(void)
{
	char string[80];

	strcpy(string, "Hello world from ");
	strcat(string, "hungry ");
	strcat(string, "and ");
	strcat(string, "hihi!");
	printf("string = %s\\n", string);

	return 0;
}
#define _CRT_SECURE_NO_WARNINGS
#include <string.h>
#include <stdio.h>

int main(void)
{
	char s1[80];
	char s2[80];
	int result;

	printf("첫번째 단어를 입력하시오: ");
	scanf("%s", s1);
	printf("두번재 단어를 입력하시오: ");
	scanf("%s", s2);

	result = 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;
}

 

문자열 검색

#include <string.h>
#include <stdio.h>

int main(void)
{
	char s[] = "language";
	char c = 'g';
	char* p;
	int loc;

	p = strchr(s, c);
	loc = (int)(p - s);
	if (p != NULL)
		printf("첫번째 %c가 %d에서 발견되었음\\n", c, loc);
	else
		printf("%c가 발견되지 않았음\\n", c);
	return 0;
}

 

문자열 토큰 분리

#define _CRT_SECURE_NO_WARNINGS
#include <string.h>
#include <stdio.h>

char s[] = "Man is immortal, because he has a soul";
char seps[] = " ,\\t\\n"; //구분자
char* token;

int main(void)
{
	token = strtok(s, seps);
	while (token != NULL) {
		printf("토큰: %s\\n", token);
		token = strtok(NULL, seps);
	}
}

 

문자열 수치 변화

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void)
{
	char s[] = "100";
	int value;

	sscanf(s, "%d", &value); //문자열에서 읽어서 집어넣음
	printf("%d \\n", value);
	value++;
	sprintf(s, "%d", value); //창이 아니라 문자열에 뿌림
	printf("%s \\n", s);
	return 0;

}
//문자열 수치 변환
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
	char s1[] = "100";
	char s2[] = "12.93";
	char buffer[100];
	int i;
	double d, result;

	i = atoi(s1);
	d = atof(s2);
	result = i + d;

	sprintf(buffer, "%f", result);
	printf("연산 결과는 %s입니다.\\n", buffer);
	return 0;
}

 

영상 파일 이름 자동 생성

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

int mian(void)
{
	char filename[100];
	char s[100];
	int i;
	for (i = 0; i < 6; i++) {
		strcpy(filename, "image");
		sprintf(s, "%d", i);
		strcat(filename, s);
		strcat(filename, ".jpg");
		printf("%s \\n", filename);
	}
	return 0;

}

float 3.141592는 4byte

“3.141592”는 9byte(8+종료문자=9)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	float f = 3.141592;
	char str[] = "3.141592";
	double value;

	value = atof(str);
	printf("%f %s", value, str);
}

 

2차원 배열로 입력

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
	int i;
	char fruits[3][20];
	for (i = 0; i < 3; i++) {
		printf("과일 이름을 입력하시오: ", fruits[i]);
		scanf("%s", fruits[i]);
	}
	for (i = 0; i < 3; i++) {
		printf("%d번째 과일 : %s\\n", i, fruits[i]);
	}
	return 0;
}
728x90

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

15. 스트림과 파일 입출력  (1) 2023.10.19
13. 구조체  (0) 2023.10.19
11. 포인터  (1) 2023.10.19
10. 배열  (0) 2023.10.19
9. 함수와 변수  (0) 2023.10.19