본문 바로가기
ProgrammingLanguage/C언어

C언어 | 문자열 함수, 버퍼, 버퍼 비우기 예제

by 씽쌩쏭 2021. 2. 19.
728x90

✅ 오늘의 문제 : 문자열 길이 비교 후 출력하기

 

두 개의 문자열을 입력 받은 후, 두 문자열 중 긴 문자열의 길이를 출력하세요.

 

  • 두 문자열의 길이가 같으면, 두 문자열을 하나의 문자열로 합쳐서 출력하세요.
  • 공백도 문자열의 길이에 포함해주세요.

 

(코뮤니티 모각코 과정 中 출제되어 푼 문제입니다.)

 

 

입력예시

 

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); 부분이 거슬릴 텐데...

 

공백 포함해서 입력 받고 싶을 때는 저렇게 써야함!!

 

동적 메모리 사용했다고 칭찬받았다 😊

오늘건 따로 바꿀 만한 게 없다고 하심... 뿌듯!

 

출력 시!