줘이리의 인생적기

C - 문자열(1) 본문

공부/C

C - 문자열(1)

줘이리 2020. 5. 18. 19:56
728x90

 

Index

  • 문자열 상수 구현
  • char 포인터
  • gets 문자열 입력
  • fgets 문자열 입력
  • fflush
  • puts, fputs

 

 

 

 

1. 문자열 상수 구현

컴파일러는 문자열을 char 배열 형태로 따로 보관하고 문자열 상수가 있던 곳은 배열의 위치 값을 사용한다.

(주소로 접근하여 문자열을 바꾸는 것은 위험, 문자열 상수를 읽기 전용 메모리 영역에 저장하기 때문)

 

 

2. char 포인터

문자열을 char포인터에 대입하면 문자열에 이름을 붙여 사용할 수 있고, 다른 문자열로 쉽게 변경 가능.

 

char포인터 예제

#include <stdio.h>

int main(void)
{
	char* ch = "apple";                    

	printf("입력 문자 : %s\n", ch);  
	ch = "banana";                        
	printf("변경 문자 : %s\n", ch); 

	return 0;
}

실행결과

 

3. scanf의 문자 입력 과정

scanf 함수는 버퍼를 사용하므로 중간에 공백, 탭, 개행 문자가 있으면 그 전까지만 저장한다.

공백전까지의 문자열을 배열에 저장하고 널 문자를 붙인다.

그 뒤 문자는 여전히 버퍼에 남아있다. 다음 호출되는 함수가 사용한다.

 

scanf 문자열 입력 예제

#include <stdio.h>

int main(void)
{
	char str[50];

	printf("문자열 입력 : ");
	scanf("%s", str);                      
	printf("첫 번째출력 : %s\n", str);   
	scanf("%s", str);
	printf("두 번째 출력 : %s\n", str);

	return 0;
}

실행결과

 

 

4. gets 문자열 입력

gets 함수는 공백, 탭 문자를 포함하여 문자열 한 줄을 입력한다.

scanf는 입력 전에 스페이스바, 탭, 엔터를 입력해도 입력을 기다린다.

그러나, gets 함수는 위 키들을 입력하므로 enter를 누를 시 입력을 끝낸다.

 

gets함수는 버퍼에서 개행 문자를 가져오지만 배열에는 널 문자로 바꾸어 저장한다.

 

 

5. fgets 문자열 입력

scanf, gets 함수는 입력되는 문자열의 크기가 배열 크기를 넘어설 위험성이 있다.

그래서 안전하게 문자열을 입력하려면 fgets 함수를 사용하는 것이 좋다.

최대 배열 크기까지만 문자열을 입력하기 때문이다.

fgets(배열명, 배열의크기, stdin);

위와 같이 사용할 수 있다.

fgets 함수는 입력 버퍼를 선택할 수 있는 함수이므로 키보드로 입력할 땐 항상 stdin을 넣어야 한다.

 

fgets 예제

#include <stdio.h>

int main(void)
{
	char str[50];

	printf("문자열 입력 : ");
	fgets(str, sizeof(str), stdin);            

	printf("입력된 문자열 : %s\n", str); 

	return 0;
}

 

실행결과

fgets 함수는 다른 함수와 다르게 버퍼에 있는 개행 문자도 배열에 저장하고 그 뒤에 널 문자를 붙여 저장한다.

 

 

개행문자를 제거해 보자.

개행문자 제거 예제

#include <stdio.h>
#include <string.h>

int main(void)
{
	char str[80];

	printf("문자열 입력 : ");
	fgets(str, sizeof(str), stdin);            
	str[strlen(str)-1] = '\0';
	printf("입력된 문자열 : %s\n", str); 

	return 0;
}

실행결과

바로 위 예제와 달리 불필요한 개행이 줄어든 것을 알 수 있다.

 

 

5. fflush

버퍼에 남아 있는 개행 문자를 지우는 방법

fflush(stdin);

 

 

6. puts, fputs

puts - 문자열을 출력하고 자동 줄 바꿈

fputs - 문자열을 출력하고 자동 줄 바꾸지 않음

 

 

'공부 > C' 카테고리의 다른 글

C - 변수의 영역, 데이터 공유  (0) 2020.05.21
C - 문자열(2)  (0) 2020.05.19
C - 문자  (0) 2020.05.18
C - 포인터  (0) 2020.05.14
C - 배열  (0) 2020.05.14