-
Notifications
You must be signed in to change notification settings - Fork 0
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
Visual Studio 2019 에서 작성 되었습니다.