01. 사용자로부터 문자열을 입력받아서 역순으로 출력하는 프로그램을 작성하라.
방법1
#include <stdio.h>
void print() {
static int a = 0;
char c = getchar();
if (c != '\n') {
if (a == 0) {
a = 1;
printf("역순 문자열: ");
}
print();
putchar(c);
}
}
int main() {
printf("문자열을 입력하시오: ");
print();
}
방법 2
#include <stdio.h>
#include <string.h>
void reverse_print(char a[], int len) {
for (int i = len - 1; i >= 0; i--) {
printf("%c", a[i]);
}
}
int main() {
char a[20];
printf("문자열을 입력하시오: ");
scanf("%s", a);
reverse_print(a, strlen(a));
}
방법 3
#include <stdio.h>
#include <string.h>
void reverse(char *s, int len) {
for (int i = 0; i < len; i++) {
printf("%c", s[len - 1 - i]);
}
}
int main() {
char a[20];
printf("문자열을 입력하시오: ");
scanf("%s", a);
reverse(a, strlen(a));
}
02. 문자열을입력으로 받아서 문자열에 포함된 모든 공백 문자를삭제하는 함수를 작성하고 테스트하라
#include <stdio.h>
int main() {
char a[100];
char b[100];
int j = 0;
printf("문자열을 입력하시오: ");
gets_s(a, sizeof(a));
for (int i = 0; a[i] != '\0'; i++) {
if (a[i] != ' ') {
b[j] = a[i];
j++;
}
}
b[j] = '\0';
printf("공백 제거 문자열 = %s", b);
}
03. 문자열을 입력으로 받아서 사용자가 지정하는 문자를 삭제하는 함수를 작성하고 테스트하라.
#include <stdio.h>
int main() {
char a[50], b[50];
char c;
int j = 0;
printf("문자열을 입력하시오: ");
scanf("%s", a);
printf("제거할 문자: ");
scanf("%c", &c);
for (int i = 0; a[i] != '\0'; i++) {
if (a[i] != c) {
b[j] = a[i];
j++;
}
}
b[j] = '\0';
printf("결과 문자열 = %s ", b);
}
04. 문자열 안에 포함된 특정한 무자의 개수를세는 함수 int str(char *s, int c)를 작성하라. s는 문자열이고 c는 개수를 셀 문자이다. strlen(*s) x-> strlen(s) o
#include <stdio.h>
int str_chr(char* s, int c) {
int count = 0;
for (int i = 0; s[i] != '\0'; i++) {
if (s[i] == c)
count++;
}
return count;
}
int main() {
char a[50];
int c, count;
printf("문자열을 입력하시오: ");
gets_s(a, sizeof(a));
printf("문자를 입력하시오: ");
c = getchar();
count = str_chr(a, c);
printf("\na의 개수: %d", count);
}
05. 사용자로부터 받은 문자열에서 각 문자가 나타나는 빈도를 계산하여 출력하는프로그램을작성하시오.
#include <stdio.h>
int main() {
char a[100];
int alpha[26] = { 0 };
printf("문자열을 입력하시오: ");
gets_s(a, sizeof(a));
for (int i = 0; a[i] != '\0'; i++) {
if (a[i] != ' ')
alpha[a[i] - 'a']++;
}
for (int i = 'a'; i <= 'z'; i++) {
printf("%c: %d \n", i, alpha[i - 'a']);
}
}
06. 문자열을사용자로부터 받아서 알파벳 문자의 개수, 숫자의 개수, 기타 특수 문자의 개수를 출력하는 프로그램을 작성하여보자.
#include <stdio.h>
#include <ctype.h>
int main() {
char a[100];
int al = 0, num = 0, etc = 0;
printf("문자열을 입력하시오: ");
scanf("%s", &a);
printf("\n");
for (int i = 0; a[i] != '\0'; i++) {
if (isalpha(a[i]))
al++;
else if (isdigit(a[i]))
num++;
else
etc++;
}
printf("문자열 안의 알파벳 문자의 개수: %d \n", al);
printf("문자열 안의 숫자의 개수: %d \n", num);
printf("문자열 안의 기타 문자의 개수: %d \n", etc);
}
07. 사용자에게 질문을 제시하고 답변을 받아서 긍정적이면 1을 반환하고 부정이면 0을 반환하는 함수 get_response(char *prompt)를 작성하고 테스트하라. 여기서 매개 변수 prompt는 사용자에게 제시하는 질문이다. 긍정을 의미하는 문자열은 "YES", "Yes" , "yes", "OK", "ok"로 가정하라. 부정을 의미하는 문자열은 은 "NO", "No", "no"로 가정하라. 대소문자는 구별하지 않는다. (고려할점: tolower 혹은 toupper를 문자 하나씩만 바꾸는 것이기에 문자열을 바꿀 경우 반복문이 필요하다.)
#include <stdio.h>
#include <ctype.h>
#include <string.h>
int get_response(char* prompt) {
for (int i = 0; prompt[i] != '\0'; i++) {
prompt[i] = tolower(prompt[i]);
}
if (strcmp(prompt, "yes")==0||strcmp(prompt,"ok")==0) {
return 1;
}
else {
return 0;
}
}
int main() {
char a[10];
printf("게임을 하시겠습니까: ");
scanf("%s", &a);
if (get_response(a)) {
printf("긍정적인 답변입니다. ");
}
else {
printf("부정적인 답변입니다.");
}
}
08. 사용자가 입력한 문자열에서 단어의 개수를 계산하여 화면에 출력하는프로그램을 작성하여보자.
(단어의 개수 구하는 문자열: char b = " ,\n\t")
#include <stdio.h>
#include <string.h>
int main() {
int count = 0;
char a[100];
char tok[] = " ,\t\n";
char* token;
printf("문자열을 입력하시오: ");
gets_s(a, sizeof(a));
token = strtok(a, tok);
while (token != NULL) {
count++;
token = strtok(NULL, tok);
}
printf("단어의 수는 %d입니다.", count);
}
09. 흔히 패스워드를 입력받을 때는 사용자가 입력한 문자 대신에 *문자를 표시한다. _getch()를 이용하여 사용자가 입력한 문자를 비밀스럽게 입력받는 프로그램을 작성하여보자.
#include <stdio.h>
#include <conio.h>
int main() {
int c, i;
char a[9];
printf("패스워드를 입력하시오: ");
for (i = 0; i < sizeof(a) - 1; i++) { // sizeof(a) -1 임을 유의하자, 문자열 배열이기 때문에 '\0'문자를 위해 1 빼야함
c = _getch();
if (c == '\r')
break;
a[i] = c;
printf("*");
}
a[i] = '\0';
printf("\n입력된 패스워드는 %s입니다.", a);
}
10. 사용자가 입력한 문자열에서 특정한 단어의 개수를 게산하여 화면에 출력하는 프로그램을 작성하여보자.
#include <stdio.h>
#include <string.h>
int main() {
char a[100], b[10];
int count = 0;
char* ad;
printf("문자열을 입력하시오: ");
gets_s(a, sizeof(a));
printf("단어: ");
scanf("%s", b);
ad = strstr(a, b);
while (ad != NULL) {
count++;
ad = strstr(ad + 1, b);
}
printf("\n%s의 개수: %d", b, count);
}
// 잘못된 코드
int main() {
char a[100], b[10];
int count = 0;
char* token;
printf("문자열을 입력하시오: ");
gets_s(a, sizeof(a));
printf("단어: ");
scanf("%s", b);
token = strtok(a, b);
while (token) {
printf("%s \n", token);
count++;
token = strtok(NULL, b);
}
printf("\n%s의 개수: %d", b, count);
}
// strtok(a, "the")는 "the"를 기준으로 토큰을 구하는게 아니라 각각 "t", "h", "e"를 기준으로 토큰을 구함
11. 간단한 철자 교정 프로그램을 작성하여보자. 문자열을입력으로 받아서 문자열 안에 마침표가 있으면문자열의 첫 번째 문자가 대문자인지를 검사한다. 만약 대문가 ㅏ아니면 대문자로 변환한다. 또한 문장의 끝에 마침표가 존재하는지를 검사한다. 역시 마침표가 없으면 넣어준다. 즉, 입력된 문자열이 "pointer is easy"라면 "Pointer is easy."로 변환하여 화면에 출력한다.
#include <stdio.h>
#include <ctype.h>
#include <string.h>
int main() {
char a[100];
printf("문자열을 입력하시오: ");
gets_s(a, sizeof(a));
if (islower(a[0])) {
a[0] = toupper(a[0]);
}
if (a[strlen(a) - 1] != '.') {
strcat(a, ".");
}
printf("수정된 텍스트: %s", a);
}
12. 회문이란 바로 읽거나 거꾸로 읽어도 같은글이 되는 단어이다. 예를 들면 "madam"와 같은 문자열이 회문이다 사용자로부터 문자열을 받아서 회문여부를 판별하여 그 결과를화면에 출력하는 프로그램을 작성해여 보라 .
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int is_palindrome(char* s) {
for (int i = 0; i < strlen(s) / 2; i++) {
if (tolower(s[i]) != tolower( s[strlen(s) - 1 - i]))
return 0;
}
return 1;
}
int main() {
char s[100];
printf("문자열을 입력하시오: ");
scanf("%s", s);
if (is_palindrome(s))
printf("회문입니다.");
else
printf("회문이 아닙니다.");
}
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int is_palindrome(const char* str) {
int left = 0;
int right = strlen(str) - 1;
while (left < right) {
if (tolower(str[left]) != tolower(str[right]))
return 0;
left++;
right--;
}
return 1;
}
int main() {
char input[100];
printf("문자열을 입력하세요: ");
scanf("%s", input);
if (is_palindrome(input))
printf("회문입니다.");
else
printf("회문이 아닙니다.");
}
13. 사용자로부터 한줄의 문자열을 입력받아서 문자열에 포함된단어들을 역순으로 배열하여 출력하는 프로그램을 작성하시오.
#include <stdio.h>
#include <string.h>
int main() {
int a[100];
char* token[100];
int i = 0;
printf("문자열을 입력하시오: ");
gets_s(a, sizeof(a));
token[0] = strtok(a, " ");
while (token[i] != NULL) {
i++;
token[i] = strtok(NULL, " ");
}
for (int j = i-1; j >= 0; j--) {
printf("%s ", token[j]);
}
}
14. 사용자에게 영어 이름을 성과 이름으로 나누어서 대문자로 입력하도록 하여서 성과 이름의 위치를 바꾸고 소문자로변환하여 추력하는 프로그램을 작성하라.
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main() {
char name[100];
char* name_[2];
printf("성과 이름을 대문자로 입력하시오: ");
gets_s(name, sizeof(name));
for (int i = 0; i <= strlen(name) - 1; i++) {
name[i] = tolower(name[i]);
}
name_[0] = strtok(name, " ");
name_[1] = strtok(NULL, " ");
printf("%s, %s", name_[1], name_[0]);
}
// for문 내에 대신해서 가능
// if (name >= 'A' && name <= 'Z') {
//name[i] = name[i] - 32;
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main() {
char name[100];
char* name_[2];
gets_s(name, sizeof(name));
for (int i = 0; i < strlen(name); i++) {
name[i] = tolower(name[i]);
}
name_[0] = strtok(name, " ");
name_[1] = strtok(NULL, " ");
strcat(name_[1], ", ");
strcat(name_[1], name_[0]);
printf("%s \n", name_[1]);
}
15. 사용자로부터 문자열을 받아서 문자열에 포함된 구두점의 개수를 세는 프로그램을 작성하라. 여기서구두점에는 마침표와 쉼표만이 포함된다고 가정하자.
#include <stdio.h>
#include <string.h>
int main() {
char a[100];
char b[] = ",.";
char* token;
int count = 0;
printf("문자열을 입력하시오: ");
gets_s(a, sizeof(a));
token = strtok(a, b);
while (token != NULL) {
count++;
token = strtok(NULL, b);
}
printf("구두점의 개수는 %d입니다. ", count);
}
16. 간단한 "찾아 바꾸기" 기능을 구현하여보자. 첫 번째로 사용자에게 최대 80 문자의 문자열을입력하도록 한다. 두 번째로 찾을 문자열을 입력받는다. 세 번째로바꿀 문자열을 입력받는다. 문자열을 찾아서 바꾼 후에 결과 문자열을 화면에 출력한다.
#include <stdio.h>
#include <string.h>
#include <conio.h>
int main() {
char seps[] = " ";
char s[200], find[100], replace[100], target[200] = "";
char* token;
printf("문자열을 입력하시오: ");
gets_s(s,sizeof(s));
printf("찾을 문자열: ");
gets_s(find,sizeof(find));
printf("바꿀 문자열: ");
gets_s(replace, sizeof(replace));
token = strtok(s, seps);
while (token != NULL) {
if (strcmp(token, find) == 0)
strcat(target, replace);
else
strcat(target, token);
token = strtok(NULL, seps);
strcat(target, " ");
}
printf("수정된 문자열: %s\n", target);
return 0;
}
#include <stdio.h>
#include <string.h>
int main() {
char s[200], find[100], replace[100], target[200] = "";
char* p;
printf("문자열을 입력하시오: ");
gets_s(s, sizeof(s));
printf("찾을 문자열: ");
gets_s(find, sizeof(find));
printf("바꿀 문자열: ");
gets_s(replace, sizeof(replace));
p = strstr(s, find);
while (p != NULL) {
strncpy(p, replace, strlen(replace));
p = strstr(p, find);
}
printf("수정된 문자열: %s", s);
}
17. 사용자로부터 받은 문자열을 버블 정렬 방법을 이용하여 정렬한 후에 출력하는 프로그램을작성하라.
#include <stdio.h>
#include <string.h>
void bubble(char a[][100], int len) {
char temp[100];
for (int i = 0; i < len-1; i++) {
for (int j = 0; j < len-1; j++) {
if (strcmp(a[j], a[j + 1]) > 0) {
strcpy(temp, a[j]);
strcpy(a[j], a[j + 1]);
strcpy(a[j + 1], temp);
}
}
}
}
int main() {
char a[10][100];
int len;
int row = sizeof(a) / sizeof(a[0]);
int col = sizeof(a[0]) / sizeof(a[0][00]);
printf("문자열의 개수: ");
scanf("%d", &len);
for (int i = 0; i < len; i++) {
printf("문자열을 입력하시오: ");
scanf("%s", a[i]);
}
bubble(a, len);
printf("정렬된 문자열은 다음과 같습니다. \n");
for (int i = 0; i < len; i++) {
printf("%s ", a[i]);
}
}
18. 다음과 같이 연산의 이름을 문자열로 받아서 해당 연산을 실행하는 프로그램을 작성하라 연산을 나타내는 문자열은 "add", "sub", "mul", "div"으로 하라.
#include <stdio.h>
#include <string.h>
int add(int num1, int num2);
int sub(int num1, int num2);
int mul(int num1, int num2);
int div(int num1, int num2);
int main() {
char* a[] = { "add","sub","mul","div" };
char cal[4];
int num1, num2, result;
int (*calculate[4])(int, int) = { add,sub,mul,div };
printf("연산을 입력하시오: ");
scanf("%s %d %d", cal, &num1, &num2);
for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++) {
if (strcmp(cal, a[i]) == 0)
result = calculate[i](num1, num2);
}
printf("연산의 결과: %d", result);
}
int add(int num1, int num2) {
return num1 + num2;
}
int sub(int num1, int num2) {
return num1 - num2;
}
int mul(int num1, int num2) {
return num1 * num2;
}
int div(int num1, int num2) {
return num1 / num2;
}
19. 요즘 길거리에서는 글자들이 흘러가는 LED 전광판을 볼수 있다. 이것을 프로그램으로 구현하여보자 .
#include <stdio.h>
#include <string.h>
int main() {
char text[100];
int len;
printf("텍스트를 입력하시오: ");
gets_s(text, sizeof(text));
printf("\n");
len = strlen(text);
for (int i = 0; i < len; i++) {
for (int j = i; j < len + i; j++) {
if (j < len)
putchar(text[j]);
else
putchar(text[j - len]);
}
puts("");
}
}
20. 암호화 방법 중에 XOR 암호화가 있다. 이 방법은평문의 각 문자에 키값을 XOR하여서 암호문을 얻는 방법이다. 암호화할때 사용한 XOR 키를 알면 암호화된 값에 다시 XOR해서 평문을 없을 수 있다. 평문과 키값을 사용자로붕터 받아서 XOR 암호화하여 출력하는 프로그램을 작성해보자.
#include <stdio.h>
#include <string.h>
void secret(char* text, char* key) {
int key_len = strlen(key);
for (int i = 0; text[i] != '\0'; i++) {
if (key[0] == text[i]) // key값과 text가 같으면 NULL이 되어버림
continue;
text[i] = text[i] ^ key[i % key_len];
}
}
int main() {
char text[100];
char key[100];
printf("텍스트를 입력하시오: ");
gets_s(text, sizeof(text));
printf("키를 입력하시오: ");
gets_s(key, sizeof(key));
puts("");
secret(text, key);
printf("암호화된 문자열: %s \n", text);
secret(text, key);
printf("복원된 문자열: %s", text);
}
21. 단어 애나그램 게임을 작성해보자. 영어 단어를 이루는 글자들이 뒤죽박죽 섞인 것을 받아서 순서대로 재배치하는 게임을 애나그램 게임이라고 한다.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#define SOL "apple"
int main() {
srand((unsigned)time(NULL));
char ques[100] = SOL;
char user[100];
char temp;
int pos1, pos2, len;
len = strlen(ques);
for (int i = 0; i < len; i++) {
pos1 = rand() % len;
pos2 = rand() % len;
temp = ques[pos1];
ques[pos1] = ques[pos2];
ques[pos2] = temp;
}
do {
printf("%s의 원래 단어를 맞춰보세요: ", ques);
scanf("%s", user);
} while (strcmp(user,SOL)!=0);
printf("축하합니다.");
}
22. 런길이 인코딩을 이용한 간단한 텍스트 압축 프로그램을 작성해본다 텍스트는 사용자로부터 직접 입력된다. 알파벳 영문자로 한정한다. 권장하는 방법은 런길이 인코딩이다. 런길이 인코딩은 무손실 압축 방법 중 하나로서, 텍스트를 압축할 때 반복되는 문자가 있으면, 이것을 반복되는 개수와 반복되는 무자로 바꾸는 방법이다. 예를 들어서"wwwssssssssschh"는 "3w9s1c2h" 로 압축하는 것이다. 전체 데이터 양이 줄얻느것을 알 수 있다.
#include <stdio.h>
void print(char *s) {
int len = strlen(s);
int count;
for (int i = 0; i < len; i++) {
count = 1;
while (i < len - 1 && s[i] == s[i + 1]) {
count++;
i++;
}
printf("%d%c", count, s[i]);
}
}
int main() {
char s[100];
printf("문자열을 입력하시오: ");
scanf("%s", s);
print(s);
}
'C' 카테고리의 다른 글
[쉽게 풀어쓴 C언어 Express 개정 4판] 14장 Programming (12) | 2024.10.11 |
---|---|
[쉽게 풀어쓴 C언어 Express 개정 4판] 13장 Programming (6) | 2024.10.09 |
[쉽게 풀어쓴 C언어 Express 개정 4판] 11장 Programming (1) | 2024.10.04 |
[쉽게 풀어쓴 C언어 Express 개정 4판] 10장 Programming (2) | 2024.10.04 |
[쉽게 풀어쓴 C언어 Express 개정 4판] 9장 Programming (1) | 2024.10.03 |