공부하자/C언어

C언어 문법 공부 3장 [C언어의 문자열]

YoBot 2016. 11. 19. 13:46
4. 문자열

C언어 에는 문자열에 관한 데이터 형태가 없기 때문에 문자열을 처리하기 위해서는 특별한 방법을 사용해야 합니다.

그 방법 중에는 배열을 사용한 방법과 포인터를 사용한 방법이 있는데 포인터를 사용한 방법은 포인터를 모른상태에선 이해가 어려울 것 입니다.
그래서 여기서는 배열을 이용한 방법만을 배우기로 하고 포인터를 사용한 방법은 포인터를 배운 후에 배우겠습니다. 

(1) 문자열 상수 (실제값).

상수 중에서도 실제값 표현을 대해 배워보겠습니다.
문자열 실제값은 아주 간단한데 그냥 ""로 문자열을 묶어 주기만 하면 됩니다.
예를 들자면 
"String" 
이런 식으로
정말 간단하죠? 그럼 이 상수가 내부적으로는 어떻게 처리될까요?

메모리 상에는 이런 식으로 들어갑니다.
주소 0x01 0x02 0x03 0x04 0x05 0x06 0x07
아스키 코드 0x53 0x74 0x72 0x69 0x6E 0x67 0x00
문자 S t r i n g (NULL)
(주소는 임의로 정한 주소임) 
이렇게 문자열은 6문자 인데 7바이트를 사용하게 되죠.

여기서 주소 0x01부터 0x06까지는 String의 각 문자에 해당하는 아스키 코드 값이 들어가 있습니다. 그리고 마지막 주소 0x07에는 0x00이 들어가 있는데

이렇게 아스키 0x00인 문자를 NULL문자라고 합니다.

C에서는 이 NULL문자를 사용해 문자열을 처리하는데 시작 주소부터 이 NULL문자가 나올때 까지를 문자열로 하는 것이죠.

즉 모든 문자열의 끝에는 NULL이 있다는 것 입니다.

물론 이 NULL문자는 컴파일러가 알아서 넣어 줌니다.

그리고 문자열의 길이는 이 NULL문자 전까지의 길이를 문자열의 길이로 하게 됩니다.
그럼 문자를 ''로 묶는 것과 ""로 묶는 것의 차이점은 다 아셨겠죠?
'A'와 "A"가 있다고 합니다.
''로 묶으면 그냥 하나의 문자로 처리하게 되고 단지 1바이트가 되는 것이죠.
하지만 ""로 묶으면 문자열로 처리하게 되고 뒤에 NULL문자가 붙으므로 1바이트가 아닌 2바이트가 됩니다. 

(2) 문자열 변수

C에서는 변수에서 문자열 형태가 없으므로 문자 배열을 사용하면 문자열 처리가 가능합니다.
배열은 아직 배우지 않았는데 자세히는 나중에 배우고 배열에 대해 간단히 알아보죠.
배열은 어떤 같은 형태의 데이터를 쭉 연결해서 늘어 놓은 구조라고 생각하시면 됩니다.

그러면 배열 선언 방법을 알아보죠. 아주 간단한데.. 
데이터형태 배열이름[배열크기]; 
이렇게 선언합니다.

데이터형태는 배열의 데이터형태 이고, 배열이름은 그 배열을 상징하는 심볼 배열크기는 그 배열의 크기 즉 몇개의 데이터를 늘어 놓을지 쓰는 것 입니다.

사용할때에는 
배열이름[첨자]=값;

변수=배열이름[첨자]; 
이런 식으로 사용합니다.

여기서 첨자는 배열에서 늘어놓은 데이터중 몇번째것을 사용할 것인지를 정하는 것 입니다. 이때 첨자는 0부터 시작해야 하므로 첫번째 것을 지정하기 위해선 0을 써 주어야 합니다.

그럼 이제 진짜로 문자배열을 사용한 문자열 처리법을 알아보죠.

문자열을 저장할 문자배열을 선언하는 방법은 
char 배열이름[문자열길이]=초기값; 
이렇게 알아두면 됩니다.

여기서 문자열 길이는 실제 길이보다 1이 더 크게 써야 합니다.

이유는 문자열 뒤에는 꼭 NULL문자가 더 붙기 때문이죠.

그럼 이렇게 선언되었으면 이 변수 안에 문자열을 넣는 방법을 알아야 겠죠?? 
char str[10];

이런 문자 배열이 있다고 합시다.

그럼 
str="String"; 
이렇게 하면 될까요??

절대로 이렇게 할수는 없습니다.

이유는 아까 배열을 사용할때는 
배열이름[첨자]=값;

변수=배열이름[첨자]; 
이렇게 사용해야 한다고 배웠기 때문이죠. 그런데 위에는 첨자를 주지 않았습니다.

그럼 어떻게 해야 할까요??

바로..

str[0]='S';

str[1]='t';

str[2]='r';

str[3]='i';

str[4]='n';

str[5]='g';

str[6]=NULL; 

이렇게 하면 되겠죠...퍽퍽~(사람들에게 맞는 소리)...으악..!

이 방법이 좀 복잡하다구요??????

만약 문자열의 길이가.. 100문자라면....윽....정말 큰일이군요..

그래서 제공하는 함수가 있는데 string.h에 정의되어 있는 strcpy라는 함수 입니다.

이 함수를 쓰면 문자배열에 간단히 문자열을 넣을수 있죠

사용법은 
strcpy(문자배열이름,문자열); 
이런 식으로 씀니다.

예를 들어 아까 그것은 
strcpy(str,"String"); 
이렇게 간단히 할수 있습니다. 이제 잘 아시겠죠? 

(3) 문자열 상수 (기억 장소를 갖는 상수)

문자열 상수 중 기억장소를 갖는 문자열 상수에 대해 알아보죠.

문자열 상수도 다른 상수처럼 선언하는 문장 앞에 const만 붙여 주고 초기값을 주면 됩니다.

예를 들어.. 
const char str[10]="String"; 
이렇게 하면 되죠.

그런데 이때 문자열의 크기는 생략해도 됩니다.

생략하면 컴파일러가 알아서 지정해 줌니다.

예를 들어.. 
const char str[]="String"; 
이렇게 하면

String의 길이인 6에 1을 더해 7로 자동으로 지정해 줌니다.

이것으로 문자열 설명을 마치고 예제 하나를 보며 분석해 보죠. 
/* 파일 이름 : C3-1.C

프로그램 내용 : 문자열 처리 프로그램. */

#include <stdio.h>

#include <string.h>

void main()

{

char str[10]; 
strcpy(str,"String");

printf("%s\n",str);

str[1]='A';

printf("%s\n",str);

이 프로그램을 분석해볼까요? 우선 입출력 함수인 printf와 문자열 복사 함수인 strcpy를 썼으므로 stdio.h와 string.h를 포함시켰습니다.

그리고 main함수가 있고 내용을 보면

처음엔 str이라는 문자배열을 선언한 것이죠.

그리고 
strcpy(str,"String"); 
이건 str에 "String"를 넣은 것이고요. 
printf("%s\n",str); 
이건 str에 들어있는 문자열을 출력한 것 입니다. 
str[1]='A'; 
이건 str배열 중 2번째 문자를 'A'로 바꾼 것이죠

왜 두번째 문자냐구요??

첨자의 시작은 0부터이니 1은 두번째 문자가 되죠.

그 다음에는 다시 출력한 것 입니다. 
결과를 볼까요?? 
C:\>C3-1.EXE

String

SAring 
C:\>