Skip to content

CHAPTER 09

Tony Kim edited this page Oct 30, 2019 · 11 revisions

문자열

  • 1번 문제

공백문자의 개수를 세는 프로그래밍

#include<stdio.h>
#include<string.h>// strlen()함수
#include<ctype.h>// isspace()함수
int main(void) {
	char str[256];
	int count = 0;

	printf("문자열? ");
	scanf_s("%[^\n]", str, 256);

	// 문자열의 길이를 n에 저장
	int n = strlen(str);

	for (int i = 0; i < n; i++) {
		// 공백문자를 찾을때 마다 count++
		if (isspace(str[i]))
			count++;
	}

	printf("공백 문자의 개수: %d", count);

	return 0;
}
[실행 결과]

문자열? ABC abc FF123   ff123
공백 문자의 개수: 3
  • 2번 문제

문자 배열을 매개변수로 전달받아 공백 문자를 모두 제거하는 함수 프로그램

#include<stdio.h>
#include<ctype.h>// isspace() 함수
void remove_space(char* str) {
	char* pstr = str;

	while (*str != 0) {
		// 공백문자를 제외하고 배열에 저장
		if (isspace(*str) == 0) {
			if (pstr != str)
				* pstr = *str;
			pstr++;
		}
		str++;
	}
	*pstr = 0;
}
int main(void) {
	char str[256];

	printf("문자열? ");
	scanf_s("%[^\n]s", str, 256);
	remove_space(str);
	printf("공백 문자 제거후: %s", str);

	return 0;
}
[실행 결과]

문자열? ABCDEF abcdef   12345
공백 문자 제거후: ABCDEFabcdef12345
  • 3번 문제

대문자와 소문자를 서로 변환하는 함수 프로그램

#include<stdio.h>
#include<string.h>// strlen()함수
#include<ctype.h>// isupper(),toupper()함수
int main(void) {
	char str[256];
	int size;

	printf("문자열? ");
	scanf_s("%[^\n]", str, 256);

	// 문자열의 크기
	size = strlen(str);

	// 대문자 소문자 변환
	for (int i = 0; i < size; i++) {
		if (isupper(str[i])) {
			str[i] = tolower(str[i]);
		}
		else if (islower(str[i])) {
			str[i] = toupper(str[i]);
		}
	}

	printf("변환 후: %s", str);

	return 0;
}
[실행 결과]

문자열? ABCDEFG abcdefg
변환 후: abcdefg ABCDEFG
  • 4번 문제

문자열을 입력받아 역순으로 변환해 출력하는 함수 프로그램

#include<stdio.h>
#include<string.h>// strlen()함수
void reverse_string(char* str, int n) {
	char temp;

	for (int i = 0; i < n / 2; i++) {
		temp = str[i];
		str[i] = str[(n - 1) - i];
		str[(n - 1) - i] = temp;
	}
}
int main(void) {
	char str[256];
	int size;

	printf("문자열? ");
	scanf_s("%[^\n]", str, 256);

	size = strlen(str);

	reverse_string(str, size);
	printf("변환 후: %s", str);

	return 0;
}
[실행 결과]

문자열? Atom Visualcode
변환 후: edoclausiV motA
  • 5번 문제

대소문자를 구분하지 않고 문자열을 비교하는 함수 프로그램

#include<stdio.h>
#define SIZE 255 // SIZE를 255로 정의
int strcmp_ic(char* a, char* b) {

	// 대문자를 모두 소문자로 변경해 비교
	while (*a >= 'A' && *a <= 'Z') {
		// ASCII A+32 == a
		*a = *a + 32;
	}
	while (*b >= 'A' && *b <= 'Z') {
		*b = *b + 32;
	}
	//같으면 1 다르면 -1 리턴
	if (*a == *b) {
		return 1;
	}
	else
		return -1;
}
int main(void) {
	char a[SIZE] = "";
	char b[SIZE] = "";

	printf("첫 번째 문자열? ");
	gets_s(a, sizeof(a));
	printf("두 번째 문자열? ");
	gets_s(b, sizeof(b));

	if (strcmp_ic(a, b) < 0) {
		printf("%s와 %s가 다릅니다.\n", a, b);
	}
	else
		printf("%s와 %s가 같습니다.\n", a, b);

	return 0;
}
[실행 결과]

첫 번째 문자열? KimChi
두 번째 문자열? kIMchi
kimChi와 kIMchi가 같습니다.
  • 6번 문제

시간 문자열이 유효한 시간인지 검사하는 함수 프로그램

#include<stdio.h>
#define MAX 256 // MAX를 256으로 정의
void check_time_str(char* time) {
	int T = 0;

	if (time[0] >= '0' && time[0] <= '2') { // hour
		if (time[1] >= '0' && time[1] <= '9')
			T++;
		if (time[0] == '2' && time[1] >= '5')
			T--;
		if (time[2] >= '0' && time[2] <= '5') { //min
			if (time[3] >= '0' && time[3] <= '9')
				T++;
		}
		if (time[4] >= '0' && time[4] <= '5') { //sec
			if (time[5] >= '0' && time[5] <= '9')
				T++;
		}
	}
	if (time[0] == '2' && time[1] == '4') { // if time over 24:00:00 false
		if (time[2] != '0' || time[3] != '0' || time[4] != '0' || time[5] != '0')
			T++;
	}
	if (T != 3) {
		printf("잘못 입력했습니다. hhmmss형식으로 입력하세요.\n");
	}
	else
		printf("%s는 유효한 시간입니다.\n", time);
}
int main(void) {
	char time[MAX];

	for (;;) {
		printf("시간(. 입력 시 종료)? ");
		scanf_s("%s", &time, MAX);

		// .을 입력하면 프로그램 종료
		if (*time == '.')
			break;

		// 입력받은 문자열 time을 매개변수로 전달
		check_time_str(time);
	}
	return 0;
}
[실행 결과]

시간(. 입력 시 종료)? 123456
123456는 유효한 시간입니다.
시간(. 입력 시 종료)? 987654
잘못 입력했습니다. hhmmss형식으로 입력하세요.
시간(. 입력 시 종료)? .
  • 7번 문제

전화번호 문자열을 입력받고 올바른 형식인지 아닌지 검사하는 함수 프로그램

#include<stdio.h>
#define MAX 256
void check_phone_str(char* phone) {
	int T = 0;

	/* 문자열에 저장된 문자가 올바른 형식인지 검사
	index0,1,2에 저장된 문자가 0,1,0인지 확인*/
	if (phone[0] == '0' && phone[1] == '1' && phone[2] == '0') {
		for (int i = 3; i <= 10; i++) {
			// 0~9 사이의 숫자가 맞으면 T++
			if (phone[i] >= '0' && phone[i] <= '9')
				T++;
		}
	}

	// 전화번호는 8자리
	if (T == 8)
		printf("%s는 유효한 전화번호입니다.\n", phone);
	else
		printf("잘못 입력했습니다. 01012345678 형식으로 입력하세요.\n");
}
int main(void) {
	char phone[MAX];

	for (;;) {
		printf("전화번호(. 입력 시 종료)? ");
		scanf_s("%s", &phone, MAX);

		// .입력시 프로그램 종료
		if (*phone == '.')
			break;

		check_phone_str(phone);
	}
	return 0;
}
[실행 결과]

전화번호(. 입력 시 종료)? 010-1234-5678
잘못 입력했습니다. 01012345678 형식으로 입력하세요.
전화번호(. 입력 시 종료)? 01012345678
01012345678는 유효한 전화번호입니다.
전화번호(. 입력 시 종료)? .
  • 8번 문제

입력받은 문자열을 시저 암호화 하는 프로그램

#include <stdio.h>
#include <string.h>// strlen()함수
#define MAX 256
int main(void) {
	char pass[MAX] = "";
	int key = 0;
	size_t size;

	for (;;) {
		printf("문자열? ");
		scanf_s("%[^\n]s", &pass, MAX);

		// .입력시 프로그램 종료
		if (*pass == '.')
			break;

		printf("암호 키(정수)? ");
		scanf_s("%d", &key);

		getchar(); // 버퍼 비움

		// 문자열의 크기를 구함
		size = strlen(pass);

		// 문자열에 key를 더해 암호화
		for (size_t i = 0; i < size; i++) {
			if (pass[i] != ' ') {
				pass[i] = pass[i] + key;
			}
		}
		printf("암호화된 문자열: %s\n", pass);
	}
	return 0;
}
[실행 결과]

문자열? ABCDEF
암호 키(정수)? 1
암호화된 문자열: BCDEFG
문자열? C# C C++
암호 키(정수)? 3
암호화된 문자열: F& F F..
문자열? .
  • 9번 문제

파일 이름과 확장자를 입력받아 확장자를 포함한 파일명을 출력하는 프로그램

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>// strcat()함수
#define MAX 256
int main(void) {
	char name[MAX] = "";
	char extn[MAX] = "";
	char dot[2] = ".";

	printf("파일명? ");
	scanf("%[^\n]s", name);

	getchar(); // 버퍼를 비움

	printf("확장자? ");
	scanf("%[^\n]s", extn);

	// 문자열을 하나로 병합
	strcat(name, dot);
	strcat(name, extn);

	printf("전체 파일명:  %s", name);

	return 0;
}
[실행 결과]

파일명? Empty_class
확장자? avi
전체 파일명: Empty_class.avi
  • 10번 문제

영문 이름을 입력받아 이니셜을 출력하는 프로그램

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
#include<string.h> //strlen(),strupr()함수
#include<ctype.h> //isblank()함수
#define MAX 256
int main(void) {
	char name[MAX] = "";

	for (;;) {
		printf("영문 이름? ");
		scanf("%[^\n]s", name);// %[^\n]s == \n을 제외한 모든 문자를 입력받음

		getchar();// 버퍼를 비움

		if (*name == '.')// .입력시 프로그램 종료
			break;
		
		printf("이니셜: ");

		_strupr(name);// 함수에 _붙이면 error C4996 오류 x

		for (size_t i = 0; i < strlen(name); i++) {
			if (i == 0) {
				printf("%c", name[0]);
			}
			// 공백 문자 뒤의 문자를 저장
			if (isblank(name[i])) {
				printf("%c", name[i + 1]);
			}
		}
		printf("\n");
	}
	return 0;
}
[실행 결과]

영문 이름? Tony Kim
이니셜: TK
영문 이름? tony kim
이니셜: TK
영문 이름? .
  • 11번 문제

최소 2문자 이상으로 입력해야하는 끝말잇기 게임 프로그램

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
#include<string.h>// strlen()함수
#define MAX 256
int main(void) {
	char word[MAX] = "";
	char check_word;
	int count = 0;

	printf("word? ");
	scanf("%s", word);

	check_word = word[strlen(word) - 1];
	count++;

	for (;;) {
	start:
		printf("word? ");
		scanf("%s", word);

		// 2글자 이하는 다시 입력
		if (strlen(word) < 3) {
			printf("too short, try again\n");
			goto start;
		}
		/* 이전 단어의 끝 문자와 입력받은 단어의 첫 문자가 틀리면
		성공 횟수 출력 후 프로그램을 종료*/
		else if (check_word != word[0]) {
			printf("WRONG WORD!!! YOU FAILED!!\n");
			printf("count: %d", count);
			break;
		}
		check_word = word[strlen(word) - 1];
		count++;
	}
	return 0;
}
[실행 결과]

word? X-mas
word? ski
word? so
too short, try again
word? iso
word? byebye
WRONG WORD!!! YOU FAILED!!
count: 3
  • 12번 문제

입력받은 문자열을 회전하여 출력하는 프로그램

/*예제문제의 조건과 동작이 다름
음수 입력시 왼쪽으로 이동하지 않음*/
#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
#include<string.h>
#define MAX 256
void reverse(char* word) {
	size_t size = strlen(word);
	char temp;

	for (size_t i = 0; i < size / 2; i++) {
		temp = word[i];
		word[i] = word[(size - 1) - i];
		word[(size - 1) - i] = temp;
	}
}
int main(void) {
	char word[MAX] = "";
	char wordA[MAX] = "";
	char wordB[MAX] = "";
	size_t key;
	
	printf("문자열? ");
	scanf("%[^\n]s", word);

	for (;;) {
		printf("이동할 글자수? ");
		scanf("%d", &key);

		if (key == 0)break;

		for (size_t i = 0; i < strlen(word); i++) {
			if (i < strlen(word) - key) {
				wordA[i] = word[i];
			}
			else wordB[strlen(word) - i - 1 ] = word[i];
			if (i == strlen(word) - key) {
				wordA[i] = NULL;
			}
		}

		reverse(wordB);

		word[0] = '\0';

		strcat(word, wordB);
		strcat(word, wordA);

		printf("%s\n", word);
	}
	return 0;
}
[실행 결과]

문자열? Happy Halloween
이동할 글자수? 2
enHappy Hallowe
이동할 글자수? 0
  • 13번 문제

앱의 사용팁을 보여주는 프로그램

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
#include<stdlib.h>// srand(),rand()함수
#include<time.h>// time()함수
#define MAX 256
int main(void) {
	srand(time(NULL));
	char tip[4][MAX] = {
		"Live Photo의 스틸 이미지를 변경할 수 있습니다.",
		"스크린 타임에서 iPhone의 하루 사용 시간을 확인할 수 있습니다.",
		"C언어는 객체 지향도 못하는 바보",
		"예비군가기 싫다..."
	};

	printf("엔터키를 누를 때마다 사용 팁을 보여줍니다.\n");

	while (getchar() != EOF) {
		int a = rand() % 4;
		printf("%s\n", tip[a]);
	}
	return 0;
}
[실행 결과]

엔터키를 누를 때마다 사용 팁을 보여줍니다.

스크린 타임에서 iPhone의 하루 사용 시간을 확인할 수 있습니다.

예비군가기 싫다...

Live Photo의 스틸 이미지를 변경할 수 있습니다.
  • 14번 문제

입력받은 아이디가 유효한지 검사하는 프로그램

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
#include<string.h>// strlen()함수
#define MAX 256
int main(void) {
	char ID[MAX] = "";
	size_t a;

start:
	printf("ID? ");
	scanf("%s", ID);
	a = strlen(ID);

	if (a < 8) {
		printf("ID는 8자 이상이어야 합니다.\n");
		goto start;
	}
	if (ID[0] >= '0' && ID[0] <= '9') {
		printf("ID는 영문자로 시작해야 합니다.\n");
		goto start;
	}
	for (size_t i = 0; i < a; i++) {
		if (ID[i] >= '!' && ID[i] <= '/' || ID[i] >= ';' && ID[i] <= '@') {
			printf("ID는 영문자와 숫자로만 구성되어야 합니다.\n");
			goto start;
		}
	}
	printf("%s는 ID로 사용할 수 있습니다.\n", ID);

	return 0;
}
[실행 결과]

ID? admin
ID는 8자 이상이어야 합니다.
ID? 1004admin
ID는 영문자로 시작해야 합니다.
ID? admin1004
admin1004는 ID로 사용할 수 있습니다.
  • 15번 문제

시,분,초를 정수로 입력받아 문자열로 만들어 리턴하는 함수 프로그램

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
#include<string.h>// strlen()함수
char time_to_string(char* time, int a, int h, int m, int s) {

	if (h > 24 || m > 60 || s > 60) {
		return -1;
	}
	// 정수를 문자열로 변환
	sprintf(&time[0], "% d", h);
	sprintf(&time[4], "% d", m);
	sprintf(&time[8], "% d", s);

	time[3] = ':';
	time[7] = ':';

	return a;
}
int main(void) {
	char time[12];
	int h, m, s;
	int a = strlen(time); // 문자열의 크기

	printf("시 분 초? ");
	scanf("%d %d %d", &h, &m, &s);

	time_to_string(time, a, h, m, s);

	printf("%s", time);

	return 0;
}
[실행 결과]

시 분 초? 12 34 56
 12: 34: 56
  • 16번 문제

id와 pw의 오류를 3회까지 허용하는 로그인 프로그램

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
#include<string.h>// strcmp()함수
#define MAX 256
/*
1. ID: abc123  PASS:123abc
2. ID: mmm123  PASS:123mmm
3. ID: mango   PASS:delicious
4. ID: need    PASS:money
5. ID: admin   PASS:want_to_go_home
*/
int main(void) {
	int num = 0;
	char ID[5][MAX]{
		"abc123",
		"mmm123",
		"mango",
		"need",
		"admin"
	};
	char PASS[5][MAX]{
		"123abc",
		"123mmm",
		"delicious",
		"money",
		"want_to_go_home"
	};
	char id[MAX] = "";
	char pass[MAX] = "";

	for (;;) {
	start:

		printf("ID: ");
		scanf("%s", id);
		printf("PW: ");
		scanf("%s", pass);

		for (int i = 0; i < 5; i++) {
			if (strcmp(ID[i], id) == 0) { //check ID
				if (strcmp(PASS[i], pass) == 0) { //check PW
					printf("로그인 성공!\n");
					return 0;
				}
				else {
					printf("패스워드가 틀렸습니다.\n");
					num++;
					goto start;
				}
			}
		}
		printf("해당 id가 없습니다.\n");
		num++;

		if (num == 3) {
			printf("로그인 실패 횟수 초과\n");
			break;
		}
	}
	return 0;
}
[실행 결과]

ID: Meka
PW: abc123
해당 id가 없습니다.
ID: admin
PW: abc123123
패스워드가 틀렸습니다.
ID: admin
PW: want_to_go_home
로그인 성공!
  • 17번 문제

노래 제목을 20개 까지 저장하고 관리하는 프로그램

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
void add(const char(*psong)[40], int b) {
	printf("노래제목? ");
	getchar();
	scanf("%[^\n]s", psong[b]);
}
void modify(const char(*psong)[40], int b) {
	char search[40];
	int find = 0;

	printf("찾을 노래 제목? ");
	getchar();
	scanf("%[^\n]s", search);

	for (int i = 0; i < b; i++) {

		if (psong[i][40] == *search) {
			printf("수정할 제목? ");
			getchar();
			scanf("%[^\n]s", psong[i + 1]);
			find++;
		}
	}
	if (find == 0) printf("노래를 찾을수 없습니다.\n");
}
void list(const char(*psong)[40], int b) {
	printf("<<노래목록>>\n");

	for (int i = 0; i < b; i++) {
		printf("%s\n", psong[i]);
	}
}
int main(void) {
	char song[20][40];
	unsigned int a, b = 0;

	for (;;) {
		printf("[ 0.종료 1.추가 2.수정 3.목록 ] 선택? ");
		scanf("%d", &a);

		if (a > 3) {
			printf("올바른 숫자를 입력해 주세요.\n");
		}
		if (a == 1) {
			add(song, b);
			b++;
		}
		if (a == 2)modify(song, b);
		if (a == 3)list(song, b);
		if (a == 0)break;
	}
	return 0;
}
[실행 결과]

[ 0.종료 1.추가 2.수정 3.목록 ] 선택? 1
노래제목? DNA
[ 0.종료 1.추가 2.수정 3.목록 ] 선택? 1
노래제목? Fke Love
[ 0.종료 1.추가 2.수정 3.목록 ] 선택? 2
찾을 노래 제목? Fke Love
수정할 제목? Fake Love
[ 0.종료 1.추가 2.수정 3.목록 ] 선택? 3
<<노래목록>>
DNA
Fake Love
[ 0.종료 1.추가 2.수정 3.목록 ] 선택? 0
Clone this wiki locally