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