문자열, 버퍼

·2023년 3월 7일
0

C

목록 보기
5/13

📌문자열(String)


  • 문자들의 배열 char 배열에 저장함

문자열을 이용할때마다 문자열의 길이를 알아야한다면 불편하다.(그래서 끝에 NULL붙여줌)

널(NULL)

문자열끝에 널(NULL)이 들어간다

#include <stdio.h>

int main() 
{
	//NULL을 나타내는 3가지
	char null_1 = '\0'; 
	char null_2 = 0;
	char null_3 = (char)NULL;  

	//널이 아님
	char not_null = '0';

	printf("NULL 의 정수(아스키)값 : %d, %d, %d \n", null_1, null_2, null_3);
	printf("'0' 의 정수(아스키)값 : %d \n", not_null);

	return 0;
}

널 문자를 위해서 뒤에 공간 하나를 더 추가해 줘야한다.

char*, char[], const char* 의 이해

char* //값 변경불가, 주소변경가능
char[] //값, 주소 변경가능
const char* //값 변경불가, 주소변경가능
#include <stdio.h>

int main()
{
	char* s1 = "aaa";
	char s2[] = "bbb";
	const char* s3 = "ccc";

	//s1[0] = 'z'; 값 바꾸기 불가능
	s2[0] = 'z';
	//s3[0] = 'z'; 값 바꾸기 불가능

	printf("원래 s1 주소: %p\n", s1);

	s1 = "change address1"; //주소에 대입해서 바꾸기 가능(값이 바뀐것 처럼 보이지만 주소가 바뀐거다)
	//s2 = "change address2"; 불가능 일일이 대입해줘야함
	s3 = "change address3";

	printf("바뀐 s1 주소 : %p\n", s1);
	printf("s1[0] 문자열 출력 : %s\n", s1);
	printf("s1[0] 문자열 출력 : %s\n", s2);
	printf("s1[0] 문자열 출력 : %s\n", s3);

}

문자열의 값을 바꾼게 아니라 주소를 바꾸어 bbb라는 값이 나온것이다.


📌버퍼(buffer)


  • 데이터를 전송하는 동안 일시적으로 데이터를 보관하는 영역(임시창고)

키보드의 입력을 처리하는 버퍼는 입력버퍼 stdin(입력스트림)

int main()
{
	int num;
	int c;

	printf("숫자를 입력하세요 : ");
	scanf("%d", &num);

	printf("문자를 입력하세요 : ");
	scanf("%c", &c);

	return 0;
}

1\n
문자를 입력하세요 부분에 \n이 들어가서 실행된다(%c 사용시 주의)
이를 해결하기 위해서는 버퍼를 비워주면 된다.

버퍼 비우기

fflush(stdin) //표준 입력 스트림을 비워줌
getchar();

fflush()는 visual studio 2015부터는 없어졌다고한다. 테스트 해봤는데 작동이 안된다.


📌문자, 문자열 입출력


#include <stdio.h>

int main() {
	
	char ch;
	char cha[100];

	ch = getchar();
	putchar(ch);

	//버퍼 비우기
	getchar();

	printf("\n");

	gets(cha);
	puts(cha);
	return 0;
}

getchar

  • stdin에서 한 문자를 읽어와서 그 값을 리턴한다.

putchar

  • 문자로 출력해준다.

gets

  • 버퍼에서 개행 문자열을 가져오지만 배열에는 널 문자로 바꿔저장(문자열이라서 그런듯?)
    '\n' -> '\0'
    엔터만 눌러도 끝난다

puts

  • 출력 후 자동으로 줄 바꿈

📌리터럴(literal)


  • 소스 코드 상에서 고정된 값을 가지는 것(상수랑 비슷하네?)

""로 묶인걸 문자열 리터럴(string literal)이라고 한다

#include <stdio.h>

int main() {
	
	char str[] = "sentence";
	char* pstr = "sentence";

	str[1] = 'a';
	//pstr[1] = 'a'; //오류나게된다
	printf("str : %s \n", str);
	printf("pstr : %s\n", pstr);
	return 0;
}

리터럴은 변경할 수 없다
str[]은 리터럴처럼 보이지만 's' 'e' 이런식으로 묶인거라서 변경가능


문제(함수관련)


Problem1.c

참고자료


씹어먹는 C언어

profile
개인공부저장용(하루의 기록)

0개의 댓글