본문 바로가기
C

220728(CH21)

by 덤더리덤떰 2022. 7. 28.

21-1.
[getchar 함수와 putchar함수의 활용]

##잘못된 코드
int ch;
	int diff = 'a' - 'A';
	ch = getchar();
	if ('A' <= ch <= 'Z') {
		ch += diff;
		putchar(ch);
	}
	else if ('a' <= ch <= 'z') {
		ch -= diff;
		putchar(ch);
	}
	else {
		printf("알파벳 이외 문자를 입력하셨습니다.");
	}

아...!! &&를 이용안하고 착각해서 저렇게 썼구나..

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int Change();

int main() {
	int ch1;
	ch1 = getchar();
	ch1=Change(ch1);
	if (ch1 == -1) {
		fputs("이건 오류다!!",stdout);
	}
	else {
		putchar(ch1);
	}
	return 0;
}

int Change(int ch) {
	if ('a' <= ch && ch <= 'z') {
		return ch - 32;
	}
	else if ('A' <= ch && ch<= 'Z') {
		return ch + 32;
	}
	else {
		return -1;
	}
}

21-2.
1번

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void RemoveBSN(char str[]) {
	int len = strlen(str);
	str[len - 1] = 0;
}

int main() {
	int i;
	int sum = 0;
	char str[20];
	char temp[1];
	fputs("문자열을 입력하시오: ", stdout);
	fgets(str, sizeof(str), stdin);
	RemoveBSN(str);

	for (i = 0; i < strlen(str); i++) {
		if (str[i] >= '1' && str[i] <= '9') {
			temp[0] = str[i];
			sum += atoi(temp);
		}
	}

	printf("합은 %d이다.", sum);

	return 0;
}

-> int atoi함수는 const char * str을 인자로 받기 때문에 임시 배열을 설정해서 그 str의 요소 값을 넣은 다음 그 임시 배열을 인자로 atoi에 넣는다.
->나의 실수: atoi의 인자에 str[i]를 입력하였다(str[i]는 값이기때문에 배열 이름을 넣어야 한다)
->이때 strlen은 널문자는 길이에 포함하지 않는다. 하지만 fgets을 통해 str을 입력받았기 때문에 줄바꿈('\n')도 같이 입력받아서 그걸 없애고자 RemoveBSN함수를 생성한 것이다.
ex)char str[]="1234567";
->strlen(str)을 하면 7 출력

2번

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main() {
	char str1[20];
	char str2[20];
	char str3[40];
	fputs("str1 문자열을 입력하세요:", stdout); 
	fgets(str1, sizeof(str1), stdin);
	str1[strlen(str1) - 1] = '\0';

	fputs("str2 문자열을 입력하세요:", stdout);
	fgets(str2, sizeof(str2), stdin);
	str2[strlen(str2) - 1] = '\0';

	strncpy(str3, str1, sizeof(str1));
	strcat(str3, str2,sizeof(str2));
	puts(str3);
	return 0;
}

-> 나의 실수: fgets은 '\n'까지 입력받기 때문에 strncpy함수와 strcat으로 이어붙일거라 없애기 위해 str1[strlen(str1)-1]='\0'으로 줄바꿈 자리에 널문자를 대입하면 되는데 착각해서 while(getchar()!='\n')을 이용했다.
-> 나의 실수: fgets은 어차피 sizeof(str)을 통해 마지막은 널문자가 입력되도록 되어 있다. 근데 착각해서 입력받는 str 마지막 자리에 널문자를 또 입력하는 바보같은 행동을 했다.

3번

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void comparename();
void compareage();

int main() {
	char str1[20];
	char str2[20];
	fputs("첫 번째 사람의 이름과 나이를 입력하세요:", stdout);
	fgets(str1, sizeof(str1), stdin);
	str1[strlen(str1) - 1] = 0;

	fputs("두 번째 사람의 이름과 나이를 입력하세요:", stdout);
	fgets(str2, sizeof(str2), stdin);
	str2[strlen(str2) - 1] = 0;

	int len1 = strlen(str1);
	int len2 = strlen(str2);
	comparename(str1, str2,len1,len2);
	compareage(str1, str2,len1, len2);
	return 0;
}

void comparename(char str1[], char str2[],int len1, int len2) {
	char temp1[20] = { 0 };
	char temp2[20] = { 0 };
	int i;
	
	for (i = 0; i < len1; i++) {
		if(str1[i]!=' '){
			temp1[i] = str1[i];
		}
	}
	for (i = 0; i < len2; i++) {
			if (str2[i] != ' ') {
			temp2[i] = str2[i];
		}
	}

	if (!strcmp(temp1, temp2)) {
		puts("두 사람의 이름은 같습니다.");
	}
	else {
		puts("두 사람의 이름은 같지 않습니다.");
	}
}

void compareage(char str1[], char str2[], int len1, int len2) {
	char temp1[20];
	char temp2[20];
	int i;
	int cnt1 = 0;
	int cnt2 = 0;
	
	for (i = 0; i <len1; i++) {
		if (str1[i] != ' ') {
			cnt1++;
		}
	}
	for (i = cnt1; i < len2; i++) {
		temp1[i] = str1[i];
	}
	for (i = 0; i < len1; i++) {
		if (str1[2] != ' ') {
			cnt2++;
		}
	}
	for (i = cnt2; i < len2; i++) {
			temp2[i] = str2[i];
	}

	if (!strcmp(temp1, temp2)) {
		puts("두 사람의 나이는 같습니다.");
	}
	else {
		puts("두 사람의 나이는 같지 않습니다.");
	}
}

'C' 카테고리의 다른 글

220809(CH25)  (0) 2022.08.09
220802(CH23)  (0) 2022.08.02
220726(CH13,18)  (0) 2022.07.26
220721(CH16)  (0) 2022.07.26
220714(CH10)  (0) 2022.07.14