문자열

|
#문자열
1) 문자 : 끝에 NULL('\0') 문자가 없다.
2) 문자 배열 : 끝에 NULL('\0') 문자가 없다.
2) 문자열 : 문자 배열이면서 끝에 NULL('\0') 문자가 있다.



#문자열 상수
printf("%p\n", 1)
printf("%p\n", '1')
printf("%p\n", "1")
모두 상수이므로 코드 영역에 할당된다.

1) 문자 상수 : 작은 따옴표(')를 이용하여 표시
ex) 'a', '3', '%', '+'
2) 문자열 상수 : 큰 따옴표(")를 이용하여 표시
ex) "This is a string."

#상수 테이블
1) 심볼 테이블 : 프로그램 내의 모든 변수의 정보가 기록되어 있다.
2) 상수 테이블 : 프로그램 내의 모든 상수의 정보가 기록되어 있다.
문자열 "string"
%d로 출력 -> "string"의 시작주소
%p로 출력 -> "string"

#문자열 선언
char carray[] = {'a', 'b', 'c'};
연속된 3개의 공간에 문자 'a', 'b', 'c'가 값으로 들어가 있는 문자 배열이다.
char string1[] = {'a', 'b', 'c', '\0'};
연속된 4개의 공간에 문자 'a', 'b', 'c'와 NULL('\0') 문자가 들어가 있는 문자열이다.
각각의 문자가 코드 영역에 순서대로 할당되고, 'a'의 시작주소가 string1에 대입된다.
메모리 할당은 코드 영역에 될까? 스택 영역에 될까?
char string2[] = "abc";
"abc"는 코드 영역에 'a', 'b', 'c', '\0'으로 할당되어 있고, 스택 영역에 배열로 할당된다???
string2에는 다른 값을 대입할 수 없다. 주소이기 때문이다. 각각의 문자변수([0], [1], [2], [3])에 값을 넣어야 바꿀 수 있다.
char *string3 = "abc";
"abc"는 코드 영역에 'a', 'b', 'c', '\0'으로 할당되어 있고, 스택 영역에 할당된 string3에 "abc"의 시작 주소가 들어가 있다.
string3에는 다른 값을 대입할 수 있다. 포인터 변수이기 때문이다.

#잘못된 문자열 선언
char string[3] = "abc";


#gets()
원형 : char *gets(char *str);
읽은 문자열을 가리키는 포인터를 반환하며, 오류가 발생하면 NULL을 반환한다.
개행문자가 나올 때까지 읽어서, 개행문자 이전까지의 문자열에 NULL 문자를 붙인 문자열을 만든 후, 매개변수가 가리키는 메모리 공간에 저장하고, 그 시작 주소를 반환한다.
1)scanf() : 단어 입력
2)gets() : 문장 입력

#puts()
원형 : int puts(char *str)
매개변수가 가리키는 값을 출력하고 마지막에 개행문자를 자동으로 출력한다.
정상적으로 실행한 후 마지막 출력문자를 반환한다. 대부분의 경우 '\n'을 출력한다.
오류가 발생하면 EOF를 반환한다.

#포인터 변수의 초기화
포인터 변수를 초기화하지 않으면 경고 메시지를 보여준다.

#문자열 함수
1) int strlen(char *s)
2) int strcmp(char *s1, char *s2)
3) int strncmp(char *s1, char *s2, int n)
4) char *strcpy(char *s1, char *s2)
5) char *strncpy(char *s1, char *s2, int n)
6) char *strcat(char *s1, char *s2)
7) char *strchr(const char *string, int c)
8) char *strrchr(const char *string, int c)
9) int atoi(const char *s)
10)int itoa(int value, char *string, int radix)


#문자열 배열
char strings[N][M] = {"string1", "string2", "string3", ... "stringN" };
최대 M의 길이를 가지는 문자열 N개를 작성할 수 있다.
코드 영역에 N개의 문자열 공간이 할당되고, 스택에도 N*M만큼의 공간이 할당된다.

#문자열 포인터 배열
char *strings[N] = {"string1", "string2", "string3", ... "stringN" };
길이 제한 없는 문자열 N개를 작성할 수 있다.
코드 영역에 N개의 문자열 공간이 할당되고, 스택에는 그 문자열의 시작주소를 가리키는 4*N만큼의 공간이 할당된다.
메모리 공간이 절약되고 문자열을 편리하게 다룰 수 있다.

원본 문자열 배열의 시작 주소만 가지는 포인터 배열은 원본의 변경없이 포인터만 바꿔주면 정렬 등의 기능을 수행할 수 있다.


#main() 함수
int main(int argc, char *argv[]);
argc, argv는 관례적으로 사용하는 것이며, 사용자가 바꿀 수 있다.
공백을 포함한 문자열을 큰따옴표로 묶으면 하나의 인수로 인식한다.

#문자 함수
1) int isalnum(int c)
2) int isalpha(int c)
3) int iscntrl(int c)
4) int isdigit(int c)
5) int isgraph(int c)
6) int islower(int c)
7) int is print(int c)
8) int ispunct(int c)
9) int isspace(int c)
10) int isupper(int c)
11) int isxdigit(int c)
12) tolower(int ch)
13) toupper(int ch)






#문자열

char string = "test";

string = string+0 = &string[0]
*string = *(string+0) = string[0]
string + 1 = &string[1]
*(string + 1) = *&string[1] = string[1]
*(1+string) = *&1[string] = 1[string]
printf("%p\n", "abc");


배열크기는 변수로 지정할 수 없다??? 디파인된 상수로는 가능??






'C' 카테고리의 다른 글

volatile  (0) 2010.06.26
포인터 상수  (0) 2010.06.24
구조체  (0) 2010.06.12
버블 정렬 c 0609  (0) 2010.06.09
다중포인터  (0) 2010.06.08
And