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);


}

+ Recent posts