티스토리 뷰

자바 개발자들은 문자열 다룰때 그냥 + 연산자 쓰면 문자열끼리 붙었고 문자열 쓰기도 쉬웠다.

그러나

c언어는 자바나 php등의 언어에 비해 문자열 다루기가 다소 까다롭다.

그 이유는 문자열은 배열로 처리해야 하기 때문에 문자열에 필요한 작업은 배열요소를 일일히 참조해야 한다.

자바 개발자들은 짜증이 나겠지만 그래도 어떻겠나. c언어 하려면 적응해야지..

우선 c언어에 "apple" 이라고 있으면 문자열 맨 끝에 널문자('\0')가 같이 저장되어 있는다.

즉, 'a' 'p' 'p' 'l' 'e' '\0' 이런식으로 메모리 어디엔가 저장되어 있다.

그래서 char app[5]="apple";
//배열 선언과 동시에 초기화 가능하다.
char app[5];
app="apple";
이거는 안된다. 배열명 app는 첫번째 배열요소를 가리키는 포인터이다. 문자열 상수 또한 포인터이므로 둘다 주소값인 상수가 된다. 즉, 상수에 상수를 대입하는 꼴이 되어 대입연산자 왼쪽에는 반드시 값을 저장하는 변수가 와야 하므로 컴파일러는 에러를 발생함.

즉, 컴파일러는 '=' : left operand must be l-value 라고 나온다.

중간에 새긴 했는데 apple이 5개라서
char app[5]="apple" 하면 에러가 발생한다.

'apple' : array bounds overflow

'\0' 널문자까지 고려해야 한다. 즉, 널문자까지 해서 6개
char app[6]="apple";  를 잡아줘야 에러가 안난다. 물로 더 크게 잡아줘도 된다. 어자피 널문자 만나면 거기서 끝나니.. app[1000] 이나 app[6]이나 널문자 만나면 끝난다.

그리고 출력할때 %s를 사용하면 널문자 전까지 출력을 한다.

c에서는 배열명은 포인터 이다.

즉, char app[6]="apple";
printf("[%s]\n",app);
하면 apple이 찍힌다. 이 원리는 c언어에서는 배열명이 포인터이기 때문에 app는 "apple"의 a를 가리키고 있다. a부터 쭉 출력해서 우리눈에는 보이지 않지만 문자열 맨끝에 널문자 '\0' 까지 출력하기 때문에 apple이 찍히는 것이다.


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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 31
글 보관함