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
  • 네이버 블로그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기