문자열을 이용할때마다 문자열의 길이를 알아야한다면 불편하다.(그래서 끝에 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* //값 변경불가, 주소변경가능
#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라는 값이 나온것이다.
키보드의 입력을 처리하는 버퍼는 입력버퍼 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;
}
""로 묶인걸 문자열 리터럴(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' 이런식으로 묶인거라서 변경가능