728x90
이름을 입력받고 띄어쓰기 (" ")를 기준으로 문자열을 나눈 뒤, 첫 글자를 대문자로 변환하는 코드다.
포인터와 ascii를 이용하거나, strtok 내장함수를 활용하는 두 가지 방식이 있다.
1. 포인터, ascii를 사용한 방식
char *strcapitalize(char *str)
{
int i;
int flag;
i = 0;
flag = 0;
while (str[i] != '\0')
{
if (flag == 0)
{
str[i] -= 32;
flag = 1;
}
if (str[i] == 32)
{
flag = 0;
}
i++;
}
return (str);
}
ascii에서 32는 space, 공백을 의미한다.
포인터를 하나씩 옮기다가 space를 만나면 flag를 0으로 변경해서 다음에 나오는 소문자를 대문자로 바꿔 준다.
대문자로 바꾸기 위해서 32를 뺀다. ( a의 ascii : 97, A의 ascii : 65 )
직관성을 위해 위의 코드는 인덱스를 사용했지만, 아래의 코드처럼 포인터 자체를 옮기는 방식을 사용해도 된다.
char *strcapitalize(char *str)
{
int flag;
flag = 0;
while (*str)
{
if (flag == 0)
{
*str -= 32;
flag = 1;
}
if (*str == 32)
flag = 0;
str++;
}
return (str);
}
2. strtok를 사용한 방식
strtok는 아래 링크의 게시글을 참조했다.
[C언어/C++] strtok 함수(문자열 자르기)에 대해서.
안녕하세요. BlockDMask 입니다. 오늘 공부할 함수는 문자열을 일정 기준을 정해서 싹둑싹둑 자를 수 있는 strtok 함수입니다. C언어 strtok 함수에 대해서 한번 알아보러 가보겠습니다. <목차> 1. strtok �
blockdmask.tistory.com
코드
#include <stdio.h>
#include <string.h>
int main() {
char name[100];
int capFlag = 1;
printf("이름을 영어 소문자로 입력하세요 : ");
// [] 안에 있는 문자만 입력받겠다는 뜻.
// ^ : 뒤에 나오는 문자 전까지만 입력받겠다는 뜻. \n, 즉 개행 전까지만 문자열을 입력받는다.
scanf("%[^\n]s", name);
char *names = strtok(name, " "); // " "를 기준으로 문자열을 나누는 strtok 함수
while (names != NULL) {
printf("%c", *names-32); // 가장 첫번째 글자는 주소값 (*name)에서 32를 빼서 대문자화
printf("%s ", names+1); // 첫번째 글자는 제외하기 위해 +1 (배열 상에서 +1)
names = strtok(NULL, " "); // 널값을 찾을 때까지 자른 뒷부분부터 다시 " "를 찾을 때까지 반복 (탐색하는 문자열 names를 Null값이 나오기 전까지 초기화)
}
printf("\n");
return 0;
}
포인트
이 코드의 포인트는 바로
strtok(NULL, " ");
이 부분이다.
names를 계속 초기화 시키며 while문이 유지되게 한다는 점이 흥미롭다.
잘못된 부분 있다면 지적 부탁드립니다.
'Study > C' 카테고리의 다른 글
[C] 주민번호 유효성 검사 (0) | 2020.09.23 |
---|---|
[C] Bubble Sort 거품 정렬 (0) | 2020.09.08 |
최근댓글