✅ 오늘의 문제 : 문자열 길이 비교 후 출력하기
두 개의 문자열을 입력 받은 후, 두 문자열 중 긴 문자열의 길이를 출력하세요.
- 두 문자열의 길이가 같으면, 두 문자열을 하나의 문자열로 합쳐서 출력하세요.
- 공백도 문자열의 길이에 포함해주세요.
(코뮤니티 모각코 과정 中 출제되어 푼 문제입니다.)
입력예시
hello world
how are you?
12
문자열 함수
문자열 함수는 <string.h> 헤더 파일을 포함시켜 사용!but <stdio.h> 헤더 파일에 내장된 문자열 함수들도 있음
<stdio.h>헤더파일 내장 문자열 함수
✔gets_s(버퍼, 버퍼크기)
: 성공하면 입력된 문자열을 반환, 실패하면 NULL을 반환
엔터 키를 누르면 입력이 끝나며 개행 문자 \n은 저장되지 않음.
*포인터를 쓰는 경우
char*gets_s(char*_Buffer, rsize_t_Size);
✔puts(문자열)
: 성공하면 음수가 아닌 값을 반환, 실패하면 EOF(-1)을 반환
*포인터를 쓰는 경우
int puts(char const*_Buffer);
#include <stdio.h>
int main() {
char buffer[100];
gets_s(buffer, sizeof(buffer)); //표준 입력에서 문자열을 입력받음
puts(buffer); //문자열을 화면에 출력
return 0;
}
<string.h> 헤더파일 내장 문자열 함수
이 헤더파일에는 C 형식 문자열 (널 종료 문자열) 을 다룰 수 있는 함수들을 포함하고 있다.
✔strcpy(str1, str2)
(string copy)
문자열을 복사한다.
str2의 문자열을 str1으로 복사
✔strlen(문자열 포인터 or 문자배열)
(string length)
문자열의 길이를 잰다.
✔strcat(str1, str2)
(string concatenate)
두 개의 문자열을 합친다.
str1에 str2를 붙임
✔strcmp(str1, str2)
(string compare)
문자열을 비교한다.
- -1 : ASCII 코드 기준으로 str2가 클 때
- 0: ASCII 코드 기준으로 두 문자열이 같을 때
- 1: ASCII 코드 기준으로 str1이 클 때
#include <stdio.h>
#include <string.h>
int main() {
char *s1 = "Hello";
char s2[10] = "world!";
printf("%d\n", strlen(s1)); //5를 반환
printf("%d\n", strcmp("aaa", "aaa")); // 0: aaa와 aaa는 같으므로 0
printf("%d\n", strcmp("aab", "aaa")); // 1: aab와 aaa 중에서 aab가 크므로 1
printf("%d\n", strcmp("aab", "aac")); // -1: aab와 aac 중에서 aac가 크므로 -1
printf("%s\n", strcpy(s1, s2)); // wolrd! 출력
printf("%s\n", strcat(s1, s2)); // Hellowolrd! 출력
return 0;
}
버퍼
버퍼에 대해 알아보기 위해 하나의 예제를 알아보겠음
#define _CRT_SECURE_NO_WARNINGS
#incldue <stdio.h>
int main() {
int num;
char c;
scanf("%d", &num);
scanf("%c", &c);
return 0;
}
위의 예제를 실행하면 어떻게 될까??
숫자를 입력하고 엔터를 치자마자 프로그램이 종료되는 것을 볼 수 있음!!
이는 scanf가 어떻게 작동하는지 확인해보면 알 수 있음!!
우리가 abcde 를 입력한다고 했을 때,
a b c d e를 각각 입력받을 때마다 처리하는 게 아니라
abcde를 잠깐 다른 곳에 보관해 두었다가 한꺼번에 받아 처리함
잠깐 보관하는 그 곳이 바로 버퍼(buffer)!!!!
키보드의 입력을 처리하는 버퍼는 입력 버퍼(stdin)이라 부름
다시 위의 예제로 돌아가보자
만약 숫자를 입력 받을 때 1을 입력 받는다 치면,
1을 입력받고 엔터를 칠 것임.
그러면 stdin에는 1\n이 저장되고,
%d에 의해 숫자만 쏙 빼가고 stdin에서 데이터를 삭제함!
그럼 stdin에는 \n만 남게됨
그런데 %c는 이유를 불문, stdin 에서 딱 한 개의 문자만을 가져오는데,
버퍼에 \n이 남아있기 때문에 냉큼 그걸 가져와서 써버리는 것...
그렇다면 어떻게 해결해야 할까?
- getchar(); 함수 사용하기
: 'stdin 에서 한 문자를 읽어와서 그 값을 리턴한다'
- fflush(stdin); 사용하기
: 'stdin을 비워버려라'는 명령어
#define _CRT_SECURE_NO_WARNINGS
#incldue <stdio.h>
int main() {
int num;
char c;
scanf("%d", &num);
getchar();
// fflush(stdin);
scanf("%c", &c);
return 0;
}
이렇게 해주면 정상적으로 돌아가는 것을 확인할 수 있다!
문제 풀이
[초안]
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
char* s1 = (char*)malloc(sizeof(char) * 30);
char s2[30];
int s1_len; //s1 문자열 길이 담을 변수
int s2_len; //s2 문자열 길이 담을 변수
//문자열 입력받기
scanf("%[^\n]&s", s1);
getchar(); //버퍼 비우기
scanf("%[^\n]s", s2);
s1_len = strlen(s1);
s2_len = strlen(s2);
/*printf("s1의 길이: %d\n", s1_len);
printf("s2의 길이: %d\n", s2_len);*/
if (s1_len > s2_len) // s1길이 > s2길이
printf("%d\n", s1_len);
else if (s1_len < s2_len) // s1길이 < s2길이
printf("%d\n", s2_len);
else if (s1_len == s2_len) { // s1길이 = s2길이
strcat(s1, s2);
printf("%s", s1);
}
return 0;
}
지난 번에 배운 동적 메모리 할당까지 사용해서 풀어봄~~
scanf("%[^\n]&s", s1); 부분이 거슬릴 텐데...
공백 포함해서 입력 받고 싶을 때는 저렇게 써야함!!
동적 메모리 사용했다고 칭찬받았다 😊
오늘건 따로 바꿀 만한 게 없다고 하심... 뿌듯!
'ProgrammingLanguage > C언어' 카테고리의 다른 글
C언어 | 콘솔창 출력위치 변경, GotoXY, COORD, SetConsoleCursorPosition, GetStdHandle(STD_OUTPUT_HANDLE), windows.h (2) | 2021.02.21 |
---|---|
C언어 | 헤더파일 예제, #ifndef, #pragma once (0) | 2021.02.19 |
C언어 | 동적 메모리 할당 예제(2) (0) | 2021.02.18 |
C언어 | 동적 메모리 할당 예제 (0) | 2021.02.16 |
C언어 | continue문 예제 (0) | 2021.02.14 |