티스토리 뷰

728x90
반응형

C를 사용하다 보면 문자열을 입력 받는 경우가 있는데 입력 받는 방법이 여러가지 있다.

방법이 여러가지고 사용법도 비슷해 헷갈리는데 한 번 정리해보자.

 

목차

  1. 문자열로 입력을 받는 경우
  2. scanf()로 입력을 받는 경우
  3. gets()로 한 줄의 문자열 입력
  4. fgets()로 입력을 받는 경우
  5. 개행 문자로 인해 gets 함수가 입력을 못하는 경우

 

 

1. 문자열로 입력을 받는 경우

#include <stdio.h>

int main(void)
{
	char* dessert = "banana";
	printf("오늘 후식은 %s입니다.\n", dessert);	// 오늘 후식은 banana입니다.
	printf("banana p is % p\n", dessert);	// banana p is 00007FF6C9DC9C24
	printf("dessert1 p is %p\n", &dessert); // dessert1 p is 000000C0D635FBB8

	dessert = "apple";
	printf("내일 후식은 %s입니다.\n", dessert);	// 내일 후식은 apple입니다.
	printf("apple p is %p\n", dessert);	// apple p is 00007FF6C9DC9C4C

	printf("dessert2 p is %p", &dessert); // dessert2 p is 000000C0D635FBB8
	while (*dessert != '\0')
	{
		putchar(*dessert); 
		dessert++; 
	} //  apple

	char* pa = "apple";
	char* pb = "apple";

	printf("\n%p, %p", pa, pb); // 00007FF7B9CE9C4C, 00007FF7B9CE9C4C
	
	return 0;
}

 

desssert 포인터에 값을 넣고 그것을 다시 수정하면 새로 값을 추가한 dessert의 메모리 주소는 이전 주소와는 다르다.
그렇게 된다면 banana를 적어놓았던 변수는 사라졌지만 메모리 값에는 남아있게 된다.
5번 라인에 선언된 dessert와 10번 라인의 dessert 변수는 같아 보이지만 실제 주소는 다르며 5번 라인에 선언된 주소 값은 더 이상 알 수 가 없다.

 

 

2. scanf()로 입력을 받는 경우

#include <stdio.h>

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

	printf("문자열 입력 :");
	scanf("%s", str); // apple jam
	printf("첫 번째 단어 : %s, p is %p\n", str, &str);	//첫 번째 단어 : apple, p is 0000003D3553F520
	
	scanf("%s", str);
	printf("버퍼에 남아있는 두 번째 단어 : %s, p is %p \n", str, &str); //버퍼에 남아있는 두 번째 단어 : jam, p is 0000003D3553F520

	return 0;
}

 

scanf 함수는 버퍼를 사용하므로 키보드로 입력한 문자열은 Enter를 누를 때 버퍼에 저장된다.
scanf 함수는 버퍼에서 문자열을 가져와 배열에 저장하는데 중간에 공백 문자, 탭 문자, 개행 문자가 있으면 그 이전까지만 저장한다.
물론 배열에 저장한 문자열의 끝에는 널 문자를 붙여서 문자열을 완성한다.
scanf 함수로 문자열을 입력할 때는 [배열의 크기 -1]까지 입력이 가능하다.

 

 

3. gets()로 한 줄의 문자열 입력

#include <stdio.h>

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

	printf("공백이 포함된 문자열 입력 : ");
	gets_s(str, strlen(str)); // apple jam
	printf("입력한 문자열은 %s 입니다.", str); // 입력한 문자열은 apple jam 입니다.

	return 0;
}

scanf() 함수는 Space Bar, Tap, Enter를 입력해도 계속 입력을 기다린다.
gets()함수는 문자열의 일부로 입력하고 문자열 입력 없이 Enter만 눌러도 입력이 끝난다.
\n 대신에 \0을 저장

 

4. fgets로 입력을 받는 경우

#include <stdio.h>

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

	printf("공백이 포함된 문자열 입력 :");

	fgets(str, sizeof(str), stdin);	//test
	printf("str size of is %d\n", strlen(str));	// str size of is 5

	str[strlen(str) - 1] = '\0';
	printf("str size2 of is %d\n", strlen(str));	// str size2 of is 4

	return 0;
}

fgets()는 문자 끝에 \n과 \0을 추가한다.(문자열 끝에 \n\0)
gets()함수는 \n만 추가
fgets()함수 끝에 \n을 없애주고 싶으면 str[strlen(str) - 1] = '\0'; 코드를 추가하자.

 

 

5. 개행 문자로 인해 gets 함수가 입력을 못하는 경우

// 12.6_개행 문자로 인해 gets 함수가 입력을 못하는 경우
#include <stdio.h>

int main(void)
{
	int age;
	char name[20];

	printf("나이 입력 : "); // 17
	scanf("%d", &age);
	//getchar();
	printf("이름 입력 : ");
	gets(name); // gets에서 scanf()에서 받은 \n을 \0으로 바꾸어준다. // 그래서 getchar()을 사용하여 \n 문자를 버린다.
	printf("나이 : %d, 이름 : %s\n", age, name); // 이름 입력 : 나이 : 17, 이름 :

	return 0;
}

gets에서 scanf()에서 받은 \n을 \0으로 바꾸어준다.그래서 scanf() 다음에 getchar() 함수를 추가하여 \n 문자를 버린다.

 

 

 

참조

  • 혼자 공부하는 C언어 12.1 - 문자열과 포인터
728x90
반응형
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/11   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
글 보관함